{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "f02249e2",
   "metadata": {},
   "outputs": [],
   "source": [
    "# importing libaries\n",
    "\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import scipy.io"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "7c6ddce9",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Define the LSTM model\n",
    "class LSTM(nn.Module):\n",
    "    def __init__(self, input_size, hidden_size, output_size):\n",
    "        super(LSTM, self).__init__()\n",
    "\n",
    "        self.hidden_size = hidden_size\n",
    "\n",
    "        self.lstm = nn.LSTM(input_size, hidden_size, batch_first=True)\n",
    "        self.fc = nn.Linear(hidden_size, output_size)\n",
    "\n",
    "    def forward(self, x, hidden):\n",
    "        output, hidden = self.lstm(x, hidden)\n",
    "        output = self.fc(output)\n",
    "        return output, hidden\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "36d6fa55",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Toy problem data\n",
    "input_size = 256  # number of columns in a dataset\n",
    "hidden_size = 32  # number of neurons\n",
    "output_size = 256  \n",
    "sequence_length = 160  # number of sequences/ number of rows\n",
    "batch_size = 1\n",
    "num_epochs = 20000"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "f6a2ae56",
   "metadata": {},
   "outputs": [],
   "source": [
    "# importing data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "2103e0ff",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'__header__': b'MATLAB 5.0 MAT-file Platform: posix, Created on: Thu Jul 20 15:02:48 2023',\n",
       " '__version__': '1.0',\n",
       " '__globals__': [],\n",
       " 'h': array([[0.03949907, 0.03945555, 0.03968762, ..., 0.04081577, 0.04034067,\n",
       "         0.03995187],\n",
       "        [0.03949522, 0.03972834, 0.04007071, ..., 0.0406224 , 0.0405568 ,\n",
       "         0.04021852],\n",
       "        [0.03980837, 0.03966293, 0.04008707, ..., 0.04077249, 0.04050591,\n",
       "         0.04019281],\n",
       "        ...,\n",
       "        [0.04915863, 0.04935256, 0.04961976, ..., 0.04917885, 0.04899574,\n",
       "         0.04881741],\n",
       "        [0.04904458, 0.04916197, 0.04943338, ..., 0.04902097, 0.04897786,\n",
       "         0.04875013],\n",
       "        [0.04913692, 0.04932824, 0.04941899, ..., 0.04888785, 0.0488357 ,\n",
       "         0.04855312]])}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Load the .mat file\n",
    "v_data = scipy.io.loadmat('v.mat')\n",
    "h_data = scipy.io.loadmat('h.mat')\n",
    "x_data = scipy.io.loadmat('x.mat')\n",
    "h_data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "172f53d3",
   "metadata": {},
   "outputs": [],
   "source": [
    "x = x_data['X']\n",
    "u = h_data['h']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "2cd6fd81",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(201, 256)\n",
      "(201, 256)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "array([[0.03949907, 0.03945555, 0.03968762, ..., 0.04081577, 0.04034067,\n",
       "        0.03995187],\n",
       "       [0.03949522, 0.03972834, 0.04007071, ..., 0.0406224 , 0.0405568 ,\n",
       "        0.04021852],\n",
       "       [0.03980837, 0.03966293, 0.04008707, ..., 0.04077249, 0.04050591,\n",
       "        0.04019281],\n",
       "       ...,\n",
       "       [0.04915863, 0.04935256, 0.04961976, ..., 0.04917885, 0.04899574,\n",
       "        0.04881741],\n",
       "       [0.04904458, 0.04916197, 0.04943338, ..., 0.04902097, 0.04897786,\n",
       "        0.04875013],\n",
       "       [0.04913692, 0.04932824, 0.04941899, ..., 0.04888785, 0.0488357 ,\n",
       "        0.04855312]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "print(x.shape)\n",
    "print(u.shape)\n",
    "u"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "bf954b1d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<torch._C.Generator at 0x7f7444147770>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Set random seed for reproducibility\n",
    "torch.manual_seed(42)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "cdabefdf",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "test data shape (40, 256)\n",
      "test target shape (40, 256)\n",
      "input data shape (160, 256)\n",
      "Target data shape (160, 256)\n"
     ]
    }
   ],
   "source": [
    "input_data = u[0:160,:]\n",
    "target_data = u[1:161, :]\n",
    "\n",
    "test_data = u[160:200, :]\n",
    "test_target = u[161:201, :]\n",
    "\n",
    "print(\"test data shape\", test_data.shape)\n",
    "print(\"test target shape\", test_target.shape)\n",
    "\n",
    "print(\"input data shape\",input_data.shape)\n",
    "print(\"Target data shape\",target_data.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "b32d98b1",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "input tensor shape torch.Size([1, 160, 256])\n",
      "Target tensor shape torch.Size([1, 160, 256])\n"
     ]
    }
   ],
   "source": [
    "# Convert data to tensors\n",
    "input_tensor = torch.tensor(input_data).view(batch_size, sequence_length, input_size).float()\n",
    "target_tensor = torch.tensor(target_data).view(batch_size, sequence_length, output_size).float()\n",
    "\n",
    "print(\"input tensor shape\",input_tensor.shape)\n",
    "print(\"Target tensor shape\",target_tensor.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "b4c0af1d",
   "metadata": {},
   "outputs": [],
   "source": [
    "# Convert test data to tensors\n",
    "test_tensor = torch.tensor(test_data).view(batch_size, 40, input_size).float()\n",
    "test_target_tensor = torch.tensor(test_target).view(batch_size, 40, output_size).float()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "928ae47f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 10/20000, Loss: 0.17706659\n",
      "Epoch: 20/20000, Loss: 0.04944223\n",
      "Epoch: 30/20000, Loss: 0.03826120\n",
      "Epoch: 40/20000, Loss: 0.03608983\n",
      "Epoch: 50/20000, Loss: 0.03149891\n",
      "Epoch: 60/20000, Loss: 0.03100103\n",
      "Epoch: 70/20000, Loss: 0.03076473\n",
      "Epoch: 80/20000, Loss: 0.03058243\n",
      "Epoch: 90/20000, Loss: 0.03055021\n",
      "Epoch: 100/20000, Loss: 0.03016698\n",
      "Epoch: 110/20000, Loss: 0.02829106\n",
      "Epoch: 120/20000, Loss: 0.02481548\n",
      "Epoch: 130/20000, Loss: 0.02091661\n",
      "Epoch: 140/20000, Loss: 0.01758108\n",
      "Epoch: 150/20000, Loss: 0.01504118\n",
      "Epoch: 160/20000, Loss: 0.01308300\n",
      "Epoch: 170/20000, Loss: 0.01153052\n",
      "Epoch: 180/20000, Loss: 0.01026766\n",
      "Epoch: 190/20000, Loss: 0.00921789\n",
      "Epoch: 200/20000, Loss: 0.00832881\n",
      "Epoch: 210/20000, Loss: 0.00756419\n",
      "Epoch: 220/20000, Loss: 0.00689842\n",
      "Epoch: 230/20000, Loss: 0.00631265\n",
      "Epoch: 240/20000, Loss: 0.00579174\n",
      "Epoch: 250/20000, Loss: 0.00531701\n",
      "Epoch: 260/20000, Loss: 0.00481365\n",
      "Epoch: 270/20000, Loss: 0.00390480\n",
      "Epoch: 280/20000, Loss: 0.00243327\n",
      "Epoch: 290/20000, Loss: 0.00137593\n",
      "Epoch: 300/20000, Loss: 0.00096824\n",
      "Epoch: 310/20000, Loss: 0.00082747\n",
      "Epoch: 320/20000, Loss: 0.00076151\n",
      "Epoch: 330/20000, Loss: 0.00076168\n",
      "Epoch: 340/20000, Loss: 0.00076597\n",
      "Epoch: 350/20000, Loss: 0.00071739\n",
      "Epoch: 360/20000, Loss: 0.00068018\n",
      "Epoch: 370/20000, Loss: 0.00065403\n",
      "Epoch: 380/20000, Loss: 0.00063759\n",
      "Epoch: 390/20000, Loss: 0.00062010\n",
      "Epoch: 400/20000, Loss: 0.00060325\n",
      "Epoch: 410/20000, Loss: 0.00058731\n",
      "Epoch: 420/20000, Loss: 0.00058422\n",
      "Epoch: 430/20000, Loss: 0.00059469\n",
      "Epoch: 440/20000, Loss: 0.00056611\n",
      "Epoch: 450/20000, Loss: 0.00053405\n",
      "Epoch: 460/20000, Loss: 0.00051631\n",
      "Epoch: 470/20000, Loss: 0.00050400\n",
      "Epoch: 480/20000, Loss: 0.00049114\n",
      "Epoch: 490/20000, Loss: 0.00047944\n",
      "Epoch: 500/20000, Loss: 0.00046827\n",
      "Epoch: 510/20000, Loss: 0.00045764\n",
      "Epoch: 520/20000, Loss: 0.00044765\n",
      "Epoch: 530/20000, Loss: 0.00043814\n",
      "Epoch: 540/20000, Loss: 0.00042914\n",
      "Epoch: 550/20000, Loss: 0.00042074\n",
      "Epoch: 560/20000, Loss: 0.00041273\n",
      "Epoch: 570/20000, Loss: 0.00040517\n",
      "Epoch: 580/20000, Loss: 0.00039849\n",
      "Epoch: 590/20000, Loss: 0.00046231\n",
      "Epoch: 600/20000, Loss: 0.00038595\n",
      "Epoch: 610/20000, Loss: 0.00038030\n",
      "Epoch: 620/20000, Loss: 0.00037552\n",
      "Epoch: 630/20000, Loss: 0.00036942\n",
      "Epoch: 640/20000, Loss: 0.00036375\n",
      "Epoch: 650/20000, Loss: 0.00035908\n",
      "Epoch: 660/20000, Loss: 0.00035463\n",
      "Epoch: 670/20000, Loss: 0.00035041\n",
      "Epoch: 680/20000, Loss: 0.00034671\n",
      "Epoch: 690/20000, Loss: 0.00034283\n",
      "Epoch: 700/20000, Loss: 0.00034086\n",
      "Epoch: 710/20000, Loss: 0.00047228\n",
      "Epoch: 720/20000, Loss: 0.00036984\n",
      "Epoch: 730/20000, Loss: 0.00033221\n",
      "Epoch: 740/20000, Loss: 0.00032774\n",
      "Epoch: 750/20000, Loss: 0.00032484\n",
      "Epoch: 760/20000, Loss: 0.00032253\n",
      "Epoch: 770/20000, Loss: 0.00032008\n",
      "Epoch: 780/20000, Loss: 0.00031765\n",
      "Epoch: 790/20000, Loss: 0.00031635\n",
      "Epoch: 800/20000, Loss: 0.00031370\n",
      "Epoch: 810/20000, Loss: 0.00031185\n",
      "Epoch: 820/20000, Loss: 0.00033684\n",
      "Epoch: 830/20000, Loss: 0.00035166\n",
      "Epoch: 840/20000, Loss: 0.00034317\n",
      "Epoch: 850/20000, Loss: 0.00031236\n",
      "Epoch: 860/20000, Loss: 0.00030822\n",
      "Epoch: 870/20000, Loss: 0.00030293\n",
      "Epoch: 880/20000, Loss: 0.00030184\n",
      "Epoch: 890/20000, Loss: 0.00030012\n",
      "Epoch: 900/20000, Loss: 0.00029862\n",
      "Epoch: 910/20000, Loss: 0.00029766\n",
      "Epoch: 920/20000, Loss: 0.00029607\n",
      "Epoch: 930/20000, Loss: 0.00029595\n",
      "Epoch: 940/20000, Loss: 0.00029461\n",
      "Epoch: 950/20000, Loss: 0.00029277\n",
      "Epoch: 960/20000, Loss: 0.00031329\n",
      "Epoch: 970/20000, Loss: 0.00032998\n",
      "Epoch: 980/20000, Loss: 0.00032362\n",
      "Epoch: 990/20000, Loss: 0.00029408\n",
      "Epoch: 1000/20000, Loss: 0.00029421\n",
      "Epoch: 1010/20000, Loss: 0.00028935\n",
      "Epoch: 1020/20000, Loss: 0.00028771\n",
      "Epoch: 1030/20000, Loss: 0.00028679\n",
      "Epoch: 1040/20000, Loss: 0.00028629\n",
      "Epoch: 1050/20000, Loss: 0.00028532\n",
      "Epoch: 1060/20000, Loss: 0.00028426\n",
      "Epoch: 1070/20000, Loss: 0.00028427\n",
      "Epoch: 1080/20000, Loss: 0.00028344\n",
      "Epoch: 1090/20000, Loss: 0.00028628\n",
      "Epoch: 1100/20000, Loss: 0.00029048\n",
      "Epoch: 1110/20000, Loss: 0.00030561\n",
      "Epoch: 1120/20000, Loss: 0.00028136\n",
      "Epoch: 1130/20000, Loss: 0.00028069\n",
      "Epoch: 1140/20000, Loss: 0.00028079\n",
      "Epoch: 1150/20000, Loss: 0.00027981\n",
      "Epoch: 1160/20000, Loss: 0.00027868\n",
      "Epoch: 1170/20000, Loss: 0.00027795\n",
      "Epoch: 1180/20000, Loss: 0.00027735\n",
      "Epoch: 1190/20000, Loss: 0.00027745\n",
      "Epoch: 1200/20000, Loss: 0.00035472\n",
      "Epoch: 1210/20000, Loss: 0.00027764\n",
      "Epoch: 1220/20000, Loss: 0.00028000\n",
      "Epoch: 1230/20000, Loss: 0.00027819\n",
      "Epoch: 1240/20000, Loss: 0.00027545\n",
      "Epoch: 1250/20000, Loss: 0.00027451\n",
      "Epoch: 1260/20000, Loss: 0.00027443\n",
      "Epoch: 1270/20000, Loss: 0.00028070\n",
      "Epoch: 1280/20000, Loss: 0.00029826\n",
      "Epoch: 1290/20000, Loss: 0.00028472\n",
      "Epoch: 1300/20000, Loss: 0.00027660\n",
      "Epoch: 1310/20000, Loss: 0.00027107\n",
      "Epoch: 1320/20000, Loss: 0.00028057\n",
      "Epoch: 1330/20000, Loss: 0.00028000\n",
      "Epoch: 1340/20000, Loss: 0.00031212\n",
      "Epoch: 1350/20000, Loss: 0.00028472\n",
      "Epoch: 1360/20000, Loss: 0.00028295\n",
      "Epoch: 1370/20000, Loss: 0.00027369\n",
      "Epoch: 1380/20000, Loss: 0.00026845\n",
      "Epoch: 1390/20000, Loss: 0.00026970\n",
      "Epoch: 1400/20000, Loss: 0.00031917\n",
      "Epoch: 1410/20000, Loss: 0.00029907\n",
      "Epoch: 1420/20000, Loss: 0.00027627\n",
      "Epoch: 1430/20000, Loss: 0.00027035\n",
      "Epoch: 1440/20000, Loss: 0.00026584\n",
      "Epoch: 1450/20000, Loss: 0.00026682\n",
      "Epoch: 1460/20000, Loss: 0.00030607\n",
      "Epoch: 1470/20000, Loss: 0.00028958\n",
      "Epoch: 1480/20000, Loss: 0.00027066\n",
      "Epoch: 1490/20000, Loss: 0.00026729\n",
      "Epoch: 1500/20000, Loss: 0.00026388\n",
      "Epoch: 1510/20000, Loss: 0.00026516\n",
      "Epoch: 1520/20000, Loss: 0.00028757\n",
      "Epoch: 1530/20000, Loss: 0.00026420\n",
      "Epoch: 1540/20000, Loss: 0.00028847\n",
      "Epoch: 1550/20000, Loss: 0.00027045\n",
      "Epoch: 1560/20000, Loss: 0.00026450\n",
      "Epoch: 1570/20000, Loss: 0.00026081\n",
      "Epoch: 1580/20000, Loss: 0.00026682\n",
      "Epoch: 1590/20000, Loss: 0.00032174\n",
      "Epoch: 1600/20000, Loss: 0.00029336\n",
      "Epoch: 1610/20000, Loss: 0.00026888\n",
      "Epoch: 1620/20000, Loss: 0.00026384\n",
      "Epoch: 1630/20000, Loss: 0.00025980\n",
      "Epoch: 1640/20000, Loss: 0.00026270\n",
      "Epoch: 1650/20000, Loss: 0.00028895\n",
      "Epoch: 1660/20000, Loss: 0.00026043\n",
      "Epoch: 1670/20000, Loss: 0.00027107\n",
      "Epoch: 1680/20000, Loss: 0.00026522\n",
      "Epoch: 1690/20000, Loss: 0.00025791\n",
      "Epoch: 1700/20000, Loss: 0.00025924\n",
      "Epoch: 1710/20000, Loss: 0.00027624\n",
      "Epoch: 1720/20000, Loss: 0.00026815\n",
      "Epoch: 1730/20000, Loss: 0.00027505\n",
      "Epoch: 1740/20000, Loss: 0.00026164\n",
      "Epoch: 1750/20000, Loss: 0.00025683\n",
      "Epoch: 1760/20000, Loss: 0.00025401\n",
      "Epoch: 1770/20000, Loss: 0.00025333\n",
      "Epoch: 1780/20000, Loss: 0.00027255\n",
      "Epoch: 1790/20000, Loss: 0.00028909\n",
      "Epoch: 1800/20000, Loss: 0.00025604\n",
      "Epoch: 1810/20000, Loss: 0.00025594\n",
      "Epoch: 1820/20000, Loss: 0.00025334\n",
      "Epoch: 1830/20000, Loss: 0.00025216\n",
      "Epoch: 1840/20000, Loss: 0.00025154\n",
      "Epoch: 1850/20000, Loss: 0.00025086\n",
      "Epoch: 1860/20000, Loss: 0.00025104\n",
      "Epoch: 1870/20000, Loss: 0.00025153\n",
      "Epoch: 1880/20000, Loss: 0.00025289\n",
      "Epoch: 1890/20000, Loss: 0.00025103\n",
      "Epoch: 1900/20000, Loss: 0.00025010\n",
      "Epoch: 1910/20000, Loss: 0.00033039\n",
      "Epoch: 1920/20000, Loss: 0.00035289\n",
      "Epoch: 1930/20000, Loss: 0.00028277\n",
      "Epoch: 1940/20000, Loss: 0.00025769\n",
      "Epoch: 1950/20000, Loss: 0.00025020\n",
      "Epoch: 1960/20000, Loss: 0.00024785\n",
      "Epoch: 1970/20000, Loss: 0.00024674\n",
      "Epoch: 1980/20000, Loss: 0.00024634\n",
      "Epoch: 1990/20000, Loss: 0.00024592\n",
      "Epoch: 2000/20000, Loss: 0.00024500\n",
      "Epoch: 2010/20000, Loss: 0.00024591\n",
      "Epoch: 2020/20000, Loss: 0.00024711\n",
      "Epoch: 2030/20000, Loss: 0.00024481\n",
      "Epoch: 2040/20000, Loss: 0.00038422\n",
      "Epoch: 2050/20000, Loss: 0.00027005\n",
      "Epoch: 2060/20000, Loss: 0.00028618\n",
      "Epoch: 2070/20000, Loss: 0.00024617\n",
      "Epoch: 2080/20000, Loss: 0.00024853\n",
      "Epoch: 2090/20000, Loss: 0.00024232\n",
      "Epoch: 2100/20000, Loss: 0.00024107\n",
      "Epoch: 2110/20000, Loss: 0.00024082\n",
      "Epoch: 2120/20000, Loss: 0.00024050\n",
      "Epoch: 2130/20000, Loss: 0.00023961\n",
      "Epoch: 2140/20000, Loss: 0.00023942\n",
      "Epoch: 2150/20000, Loss: 0.00023949\n",
      "Epoch: 2160/20000, Loss: 0.00023993\n",
      "Epoch: 2170/20000, Loss: 0.00023967\n",
      "Epoch: 2180/20000, Loss: 0.00023951\n",
      "Epoch: 2190/20000, Loss: 0.00023859\n",
      "Epoch: 2200/20000, Loss: 0.00025706\n",
      "Epoch: 2210/20000, Loss: 0.00029567\n",
      "Epoch: 2220/20000, Loss: 0.00031561\n",
      "Epoch: 2230/20000, Loss: 0.00024874\n",
      "Epoch: 2240/20000, Loss: 0.00023824\n",
      "Epoch: 2250/20000, Loss: 0.00023797\n",
      "Epoch: 2260/20000, Loss: 0.00023468\n",
      "Epoch: 2270/20000, Loss: 0.00023439\n",
      "Epoch: 2280/20000, Loss: 0.00023394\n",
      "Epoch: 2290/20000, Loss: 0.00023308\n",
      "Epoch: 2300/20000, Loss: 0.00023199\n",
      "Epoch: 2310/20000, Loss: 0.00023502\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 2320/20000, Loss: 0.00023493\n",
      "Epoch: 2330/20000, Loss: 0.00023256\n",
      "Epoch: 2340/20000, Loss: 0.00023050\n",
      "Epoch: 2350/20000, Loss: 0.00023062\n",
      "Epoch: 2360/20000, Loss: 0.00023111\n",
      "Epoch: 2370/20000, Loss: 0.00023902\n",
      "Epoch: 2380/20000, Loss: 0.00041539\n",
      "Epoch: 2390/20000, Loss: 0.00025054\n",
      "Epoch: 2400/20000, Loss: 0.00025071\n",
      "Epoch: 2410/20000, Loss: 0.00023557\n",
      "Epoch: 2420/20000, Loss: 0.00022752\n",
      "Epoch: 2430/20000, Loss: 0.00022690\n",
      "Epoch: 2440/20000, Loss: 0.00022570\n",
      "Epoch: 2450/20000, Loss: 0.00022543\n",
      "Epoch: 2460/20000, Loss: 0.00022557\n",
      "Epoch: 2470/20000, Loss: 0.00022642\n",
      "Epoch: 2480/20000, Loss: 0.00022697\n",
      "Epoch: 2490/20000, Loss: 0.00022783\n",
      "Epoch: 2500/20000, Loss: 0.00022640\n",
      "Epoch: 2510/20000, Loss: 0.00022591\n",
      "Epoch: 2520/20000, Loss: 0.00022445\n",
      "Epoch: 2530/20000, Loss: 0.00022310\n",
      "Epoch: 2540/20000, Loss: 0.00042690\n",
      "Epoch: 2550/20000, Loss: 0.00026674\n",
      "Epoch: 2560/20000, Loss: 0.00022820\n",
      "Epoch: 2570/20000, Loss: 0.00022278\n",
      "Epoch: 2580/20000, Loss: 0.00022070\n",
      "Epoch: 2590/20000, Loss: 0.00021975\n",
      "Epoch: 2600/20000, Loss: 0.00021880\n",
      "Epoch: 2610/20000, Loss: 0.00021953\n",
      "Epoch: 2620/20000, Loss: 0.00021963\n",
      "Epoch: 2630/20000, Loss: 0.00022034\n",
      "Epoch: 2640/20000, Loss: 0.00021948\n",
      "Epoch: 2650/20000, Loss: 0.00021896\n",
      "Epoch: 2660/20000, Loss: 0.00021754\n",
      "Epoch: 2670/20000, Loss: 0.00021741\n",
      "Epoch: 2680/20000, Loss: 0.00021828\n",
      "Epoch: 2690/20000, Loss: 0.00021793\n",
      "Epoch: 2700/20000, Loss: 0.00028040\n",
      "Epoch: 2710/20000, Loss: 0.00042961\n",
      "Epoch: 2720/20000, Loss: 0.00027687\n",
      "Epoch: 2730/20000, Loss: 0.00022185\n",
      "Epoch: 2740/20000, Loss: 0.00021462\n",
      "Epoch: 2750/20000, Loss: 0.00021345\n",
      "Epoch: 2760/20000, Loss: 0.00021333\n",
      "Epoch: 2770/20000, Loss: 0.00021338\n",
      "Epoch: 2780/20000, Loss: 0.00021254\n",
      "Epoch: 2790/20000, Loss: 0.00021155\n",
      "Epoch: 2800/20000, Loss: 0.00021391\n",
      "Epoch: 2810/20000, Loss: 0.00021168\n",
      "Epoch: 2820/20000, Loss: 0.00021147\n",
      "Epoch: 2830/20000, Loss: 0.00021123\n",
      "Epoch: 2840/20000, Loss: 0.00021070\n",
      "Epoch: 2850/20000, Loss: 0.00021039\n",
      "Epoch: 2860/20000, Loss: 0.00021069\n",
      "Epoch: 2870/20000, Loss: 0.00021122\n",
      "Epoch: 2880/20000, Loss: 0.00031927\n",
      "Epoch: 2890/20000, Loss: 0.00030173\n",
      "Epoch: 2900/20000, Loss: 0.00021453\n",
      "Epoch: 2910/20000, Loss: 0.00022038\n",
      "Epoch: 2920/20000, Loss: 0.00020654\n",
      "Epoch: 2930/20000, Loss: 0.00020588\n",
      "Epoch: 2940/20000, Loss: 0.00020465\n",
      "Epoch: 2950/20000, Loss: 0.00020482\n",
      "Epoch: 2960/20000, Loss: 0.00020498\n",
      "Epoch: 2970/20000, Loss: 0.00020393\n",
      "Epoch: 2980/20000, Loss: 0.00020427\n",
      "Epoch: 2990/20000, Loss: 0.00020361\n",
      "Epoch: 3000/20000, Loss: 0.00020739\n",
      "Epoch: 3010/20000, Loss: 0.00034363\n",
      "Epoch: 3020/20000, Loss: 0.00036518\n",
      "Epoch: 3030/20000, Loss: 0.00025788\n",
      "Epoch: 3040/20000, Loss: 0.00022028\n",
      "Epoch: 3050/20000, Loss: 0.00020154\n",
      "Epoch: 3060/20000, Loss: 0.00020180\n",
      "Epoch: 3070/20000, Loss: 0.00020113\n",
      "Epoch: 3080/20000, Loss: 0.00020035\n",
      "Epoch: 3090/20000, Loss: 0.00019893\n",
      "Epoch: 3100/20000, Loss: 0.00019782\n",
      "Epoch: 3110/20000, Loss: 0.00019801\n",
      "Epoch: 3120/20000, Loss: 0.00019901\n",
      "Epoch: 3130/20000, Loss: 0.00020187\n",
      "Epoch: 3140/20000, Loss: 0.00020248\n",
      "Epoch: 3150/20000, Loss: 0.00020058\n",
      "Epoch: 3160/20000, Loss: 0.00020195\n",
      "Epoch: 3170/20000, Loss: 0.00021795\n",
      "Epoch: 3180/20000, Loss: 0.00028675\n",
      "Epoch: 3190/20000, Loss: 0.00024984\n",
      "Epoch: 3200/20000, Loss: 0.00022007\n",
      "Epoch: 3210/20000, Loss: 0.00020568\n",
      "Epoch: 3220/20000, Loss: 0.00019390\n",
      "Epoch: 3230/20000, Loss: 0.00019415\n",
      "Epoch: 3240/20000, Loss: 0.00019257\n",
      "Epoch: 3250/20000, Loss: 0.00019151\n",
      "Epoch: 3260/20000, Loss: 0.00019187\n",
      "Epoch: 3270/20000, Loss: 0.00019194\n",
      "Epoch: 3280/20000, Loss: 0.00019112\n",
      "Epoch: 3290/20000, Loss: 0.00019687\n",
      "Epoch: 3300/20000, Loss: 0.00019585\n",
      "Epoch: 3310/20000, Loss: 0.00019551\n",
      "Epoch: 3320/20000, Loss: 0.00019523\n",
      "Epoch: 3330/20000, Loss: 0.00020011\n",
      "Epoch: 3340/20000, Loss: 0.00048200\n",
      "Epoch: 3350/20000, Loss: 0.00020861\n",
      "Epoch: 3360/20000, Loss: 0.00022081\n",
      "Epoch: 3370/20000, Loss: 0.00019158\n",
      "Epoch: 3380/20000, Loss: 0.00019206\n",
      "Epoch: 3390/20000, Loss: 0.00018638\n",
      "Epoch: 3400/20000, Loss: 0.00018558\n",
      "Epoch: 3410/20000, Loss: 0.00018477\n",
      "Epoch: 3420/20000, Loss: 0.00018725\n",
      "Epoch: 3430/20000, Loss: 0.00018735\n",
      "Epoch: 3440/20000, Loss: 0.00018742\n",
      "Epoch: 3450/20000, Loss: 0.00018808\n",
      "Epoch: 3460/20000, Loss: 0.00018850\n",
      "Epoch: 3470/20000, Loss: 0.00024760\n",
      "Epoch: 3480/20000, Loss: 0.00021810\n",
      "Epoch: 3490/20000, Loss: 0.00021643\n",
      "Epoch: 3500/20000, Loss: 0.00019266\n",
      "Epoch: 3510/20000, Loss: 0.00018803\n",
      "Epoch: 3520/20000, Loss: 0.00018377\n",
      "Epoch: 3530/20000, Loss: 0.00018374\n",
      "Epoch: 3540/20000, Loss: 0.00018073\n",
      "Epoch: 3550/20000, Loss: 0.00018112\n",
      "Epoch: 3560/20000, Loss: 0.00018363\n",
      "Epoch: 3570/20000, Loss: 0.00018191\n",
      "Epoch: 3580/20000, Loss: 0.00018171\n",
      "Epoch: 3590/20000, Loss: 0.00018391\n",
      "Epoch: 3600/20000, Loss: 0.00043014\n",
      "Epoch: 3610/20000, Loss: 0.00025512\n",
      "Epoch: 3620/20000, Loss: 0.00021267\n",
      "Epoch: 3630/20000, Loss: 0.00018243\n",
      "Epoch: 3640/20000, Loss: 0.00017762\n",
      "Epoch: 3650/20000, Loss: 0.00017659\n",
      "Epoch: 3660/20000, Loss: 0.00017634\n",
      "Epoch: 3670/20000, Loss: 0.00017790\n",
      "Epoch: 3680/20000, Loss: 0.00017601\n",
      "Epoch: 3690/20000, Loss: 0.00017584\n",
      "Epoch: 3700/20000, Loss: 0.00018037\n",
      "Epoch: 3710/20000, Loss: 0.00018264\n",
      "Epoch: 3720/20000, Loss: 0.00020289\n",
      "Epoch: 3730/20000, Loss: 0.00030313\n",
      "Epoch: 3740/20000, Loss: 0.00019495\n",
      "Epoch: 3750/20000, Loss: 0.00019560\n",
      "Epoch: 3760/20000, Loss: 0.00017737\n",
      "Epoch: 3770/20000, Loss: 0.00017233\n",
      "Epoch: 3780/20000, Loss: 0.00017203\n",
      "Epoch: 3790/20000, Loss: 0.00017155\n",
      "Epoch: 3800/20000, Loss: 0.00017091\n",
      "Epoch: 3810/20000, Loss: 0.00017133\n",
      "Epoch: 3820/20000, Loss: 0.00016943\n",
      "Epoch: 3830/20000, Loss: 0.00018843\n",
      "Epoch: 3840/20000, Loss: 0.00038930\n",
      "Epoch: 3850/20000, Loss: 0.00018519\n",
      "Epoch: 3860/20000, Loss: 0.00019529\n",
      "Epoch: 3870/20000, Loss: 0.00017442\n",
      "Epoch: 3880/20000, Loss: 0.00016705\n",
      "Epoch: 3890/20000, Loss: 0.00016691\n",
      "Epoch: 3900/20000, Loss: 0.00016964\n",
      "Epoch: 3910/20000, Loss: 0.00016849\n",
      "Epoch: 3920/20000, Loss: 0.00016960\n",
      "Epoch: 3930/20000, Loss: 0.00016800\n",
      "Epoch: 3940/20000, Loss: 0.00016747\n",
      "Epoch: 3950/20000, Loss: 0.00023117\n",
      "Epoch: 3960/20000, Loss: 0.00020528\n",
      "Epoch: 3970/20000, Loss: 0.00020350\n",
      "Epoch: 3980/20000, Loss: 0.00017642\n",
      "Epoch: 3990/20000, Loss: 0.00016941\n",
      "Epoch: 4000/20000, Loss: 0.00016222\n",
      "Epoch: 4010/20000, Loss: 0.00016330\n",
      "Epoch: 4020/20000, Loss: 0.00016166\n",
      "Epoch: 4030/20000, Loss: 0.00016101\n",
      "Epoch: 4040/20000, Loss: 0.00016582\n",
      "Epoch: 4050/20000, Loss: 0.00016579\n",
      "Epoch: 4060/20000, Loss: 0.00016712\n",
      "Epoch: 4070/20000, Loss: 0.00016990\n",
      "Epoch: 4080/20000, Loss: 0.00041087\n",
      "Epoch: 4090/20000, Loss: 0.00025089\n",
      "Epoch: 4100/20000, Loss: 0.00016892\n",
      "Epoch: 4110/20000, Loss: 0.00016999\n",
      "Epoch: 4120/20000, Loss: 0.00016104\n",
      "Epoch: 4130/20000, Loss: 0.00015773\n",
      "Epoch: 4140/20000, Loss: 0.00015763\n",
      "Epoch: 4150/20000, Loss: 0.00015826\n",
      "Epoch: 4160/20000, Loss: 0.00015809\n",
      "Epoch: 4170/20000, Loss: 0.00015591\n",
      "Epoch: 4180/20000, Loss: 0.00015713\n",
      "Epoch: 4190/20000, Loss: 0.00018783\n",
      "Epoch: 4200/20000, Loss: 0.00029052\n",
      "Epoch: 4210/20000, Loss: 0.00021195\n",
      "Epoch: 4220/20000, Loss: 0.00016571\n",
      "Epoch: 4230/20000, Loss: 0.00015548\n",
      "Epoch: 4240/20000, Loss: 0.00015518\n",
      "Epoch: 4250/20000, Loss: 0.00015388\n",
      "Epoch: 4260/20000, Loss: 0.00015250\n",
      "Epoch: 4270/20000, Loss: 0.00015413\n",
      "Epoch: 4280/20000, Loss: 0.00015617\n",
      "Epoch: 4290/20000, Loss: 0.00015689\n",
      "Epoch: 4300/20000, Loss: 0.00015594\n",
      "Epoch: 4310/20000, Loss: 0.00015505\n",
      "Epoch: 4320/20000, Loss: 0.00025278\n",
      "Epoch: 4330/20000, Loss: 0.00023709\n",
      "Epoch: 4340/20000, Loss: 0.00017012\n",
      "Epoch: 4350/20000, Loss: 0.00016913\n",
      "Epoch: 4360/20000, Loss: 0.00015229\n",
      "Epoch: 4370/20000, Loss: 0.00014751\n",
      "Epoch: 4380/20000, Loss: 0.00014858\n",
      "Epoch: 4390/20000, Loss: 0.00014841\n",
      "Epoch: 4400/20000, Loss: 0.00014741\n",
      "Epoch: 4410/20000, Loss: 0.00014688\n",
      "Epoch: 4420/20000, Loss: 0.00015145\n",
      "Epoch: 4430/20000, Loss: 0.00015316\n",
      "Epoch: 4440/20000, Loss: 0.00015108\n",
      "Epoch: 4450/20000, Loss: 0.00018112\n",
      "Epoch: 4460/20000, Loss: 0.00025068\n",
      "Epoch: 4470/20000, Loss: 0.00019502\n",
      "Epoch: 4480/20000, Loss: 0.00016244\n",
      "Epoch: 4490/20000, Loss: 0.00014475\n",
      "Epoch: 4500/20000, Loss: 0.00014329\n",
      "Epoch: 4510/20000, Loss: 0.00014323\n",
      "Epoch: 4520/20000, Loss: 0.00014298\n",
      "Epoch: 4530/20000, Loss: 0.00014359\n",
      "Epoch: 4540/20000, Loss: 0.00014475\n",
      "Epoch: 4550/20000, Loss: 0.00014403\n",
      "Epoch: 4560/20000, Loss: 0.00014531\n",
      "Epoch: 4570/20000, Loss: 0.00016227\n",
      "Epoch: 4580/20000, Loss: 0.00045876\n",
      "Epoch: 4590/20000, Loss: 0.00015676\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 4600/20000, Loss: 0.00017187\n",
      "Epoch: 4610/20000, Loss: 0.00014230\n",
      "Epoch: 4620/20000, Loss: 0.00013866\n",
      "Epoch: 4630/20000, Loss: 0.00014027\n",
      "Epoch: 4640/20000, Loss: 0.00014047\n",
      "Epoch: 4650/20000, Loss: 0.00014196\n",
      "Epoch: 4660/20000, Loss: 0.00013998\n",
      "Epoch: 4670/20000, Loss: 0.00014278\n",
      "Epoch: 4680/20000, Loss: 0.00013946\n",
      "Epoch: 4690/20000, Loss: 0.00013907\n",
      "Epoch: 4700/20000, Loss: 0.00014417\n",
      "Epoch: 4710/20000, Loss: 0.00048909\n",
      "Epoch: 4720/20000, Loss: 0.00023746\n",
      "Epoch: 4730/20000, Loss: 0.00018814\n",
      "Epoch: 4740/20000, Loss: 0.00013825\n",
      "Epoch: 4750/20000, Loss: 0.00013937\n",
      "Epoch: 4760/20000, Loss: 0.00013290\n",
      "Epoch: 4770/20000, Loss: 0.00013349\n",
      "Epoch: 4780/20000, Loss: 0.00013442\n",
      "Epoch: 4790/20000, Loss: 0.00013761\n",
      "Epoch: 4800/20000, Loss: 0.00013550\n",
      "Epoch: 4810/20000, Loss: 0.00013688\n",
      "Epoch: 4820/20000, Loss: 0.00014134\n",
      "Epoch: 4830/20000, Loss: 0.00014404\n",
      "Epoch: 4840/20000, Loss: 0.00018392\n",
      "Epoch: 4850/20000, Loss: 0.00018478\n",
      "Epoch: 4860/20000, Loss: 0.00013808\n",
      "Epoch: 4870/20000, Loss: 0.00013371\n",
      "Epoch: 4880/20000, Loss: 0.00013370\n",
      "Epoch: 4890/20000, Loss: 0.00013053\n",
      "Epoch: 4900/20000, Loss: 0.00012908\n",
      "Epoch: 4910/20000, Loss: 0.00012942\n",
      "Epoch: 4920/20000, Loss: 0.00013195\n",
      "Epoch: 4930/20000, Loss: 0.00017095\n",
      "Epoch: 4940/20000, Loss: 0.00030398\n",
      "Epoch: 4950/20000, Loss: 0.00020373\n",
      "Epoch: 4960/20000, Loss: 0.00013408\n",
      "Epoch: 4970/20000, Loss: 0.00013550\n",
      "Epoch: 4980/20000, Loss: 0.00012587\n",
      "Epoch: 4990/20000, Loss: 0.00012557\n",
      "Epoch: 5000/20000, Loss: 0.00012423\n",
      "Epoch: 5010/20000, Loss: 0.00012513\n",
      "Epoch: 5020/20000, Loss: 0.00012629\n",
      "Epoch: 5030/20000, Loss: 0.00013334\n",
      "Epoch: 5040/20000, Loss: 0.00012745\n",
      "Epoch: 5050/20000, Loss: 0.00012705\n",
      "Epoch: 5060/20000, Loss: 0.00019884\n",
      "Epoch: 5070/20000, Loss: 0.00012177\n",
      "Epoch: 5080/20000, Loss: 0.00011801\n",
      "Epoch: 5090/20000, Loss: 0.00011711\n",
      "Epoch: 5100/20000, Loss: 0.00011709\n",
      "Epoch: 5110/20000, Loss: 0.00011441\n",
      "Epoch: 5120/20000, Loss: 0.00011866\n",
      "Epoch: 5130/20000, Loss: 0.00012372\n",
      "Epoch: 5140/20000, Loss: 0.00022734\n",
      "Epoch: 5150/20000, Loss: 0.00014369\n",
      "Epoch: 5160/20000, Loss: 0.00013557\n",
      "Epoch: 5170/20000, Loss: 0.00011887\n",
      "Epoch: 5180/20000, Loss: 0.00011129\n",
      "Epoch: 5190/20000, Loss: 0.00010876\n",
      "Epoch: 5200/20000, Loss: 0.00011180\n",
      "Epoch: 5210/20000, Loss: 0.00011184\n",
      "Epoch: 5220/20000, Loss: 0.00011003\n",
      "Epoch: 5230/20000, Loss: 0.00010904\n",
      "Epoch: 5240/20000, Loss: 0.00013154\n",
      "Epoch: 5250/20000, Loss: 0.00040330\n",
      "Epoch: 5260/20000, Loss: 0.00016870\n",
      "Epoch: 5270/20000, Loss: 0.00011777\n",
      "Epoch: 5280/20000, Loss: 0.00011888\n",
      "Epoch: 5290/20000, Loss: 0.00010483\n",
      "Epoch: 5300/20000, Loss: 0.00010635\n",
      "Epoch: 5310/20000, Loss: 0.00010465\n",
      "Epoch: 5320/20000, Loss: 0.00010576\n",
      "Epoch: 5330/20000, Loss: 0.00010734\n",
      "Epoch: 5340/20000, Loss: 0.00010894\n",
      "Epoch: 5350/20000, Loss: 0.00010730\n",
      "Epoch: 5360/20000, Loss: 0.00010686\n",
      "Epoch: 5370/20000, Loss: 0.00010921\n",
      "Epoch: 5380/20000, Loss: 0.00010839\n",
      "Epoch: 5390/20000, Loss: 0.00011400\n",
      "Epoch: 5400/20000, Loss: 0.00033092\n",
      "Epoch: 5410/20000, Loss: 0.00021938\n",
      "Epoch: 5420/20000, Loss: 0.00011698\n",
      "Epoch: 5430/20000, Loss: 0.00010883\n",
      "Epoch: 5440/20000, Loss: 0.00010395\n",
      "Epoch: 5450/20000, Loss: 0.00009934\n",
      "Epoch: 5460/20000, Loss: 0.00009809\n",
      "Epoch: 5470/20000, Loss: 0.00010002\n",
      "Epoch: 5480/20000, Loss: 0.00009979\n",
      "Epoch: 5490/20000, Loss: 0.00010519\n",
      "Epoch: 5500/20000, Loss: 0.00010450\n",
      "Epoch: 5510/20000, Loss: 0.00010461\n",
      "Epoch: 5520/20000, Loss: 0.00010810\n",
      "Epoch: 5530/20000, Loss: 0.00011849\n",
      "Epoch: 5540/20000, Loss: 0.00047077\n",
      "Epoch: 5550/20000, Loss: 0.00014290\n",
      "Epoch: 5560/20000, Loss: 0.00010770\n",
      "Epoch: 5570/20000, Loss: 0.00010756\n",
      "Epoch: 5580/20000, Loss: 0.00009658\n",
      "Epoch: 5590/20000, Loss: 0.00009610\n",
      "Epoch: 5600/20000, Loss: 0.00009520\n",
      "Epoch: 5610/20000, Loss: 0.00009654\n",
      "Epoch: 5620/20000, Loss: 0.00009704\n",
      "Epoch: 5630/20000, Loss: 0.00010027\n",
      "Epoch: 5640/20000, Loss: 0.00009803\n",
      "Epoch: 5650/20000, Loss: 0.00009874\n",
      "Epoch: 5660/20000, Loss: 0.00010112\n",
      "Epoch: 5670/20000, Loss: 0.00010395\n",
      "Epoch: 5680/20000, Loss: 0.00010680\n",
      "Epoch: 5690/20000, Loss: 0.00010656\n",
      "Epoch: 5700/20000, Loss: 0.00024795\n",
      "Epoch: 5710/20000, Loss: 0.00013032\n",
      "Epoch: 5720/20000, Loss: 0.00011680\n",
      "Epoch: 5730/20000, Loss: 0.00010066\n",
      "Epoch: 5740/20000, Loss: 0.00009293\n",
      "Epoch: 5750/20000, Loss: 0.00009057\n",
      "Epoch: 5760/20000, Loss: 0.00009001\n",
      "Epoch: 5770/20000, Loss: 0.00009100\n",
      "Epoch: 5780/20000, Loss: 0.00009343\n",
      "Epoch: 5790/20000, Loss: 0.00010410\n",
      "Epoch: 5800/20000, Loss: 0.00025651\n",
      "Epoch: 5810/20000, Loss: 0.00012692\n",
      "Epoch: 5820/20000, Loss: 0.00010389\n",
      "Epoch: 5830/20000, Loss: 0.00009504\n",
      "Epoch: 5840/20000, Loss: 0.00009029\n",
      "Epoch: 5850/20000, Loss: 0.00008843\n",
      "Epoch: 5860/20000, Loss: 0.00008838\n",
      "Epoch: 5870/20000, Loss: 0.00009167\n",
      "Epoch: 5880/20000, Loss: 0.00010547\n",
      "Epoch: 5890/20000, Loss: 0.00030082\n",
      "Epoch: 5900/20000, Loss: 0.00014815\n",
      "Epoch: 5910/20000, Loss: 0.00010698\n",
      "Epoch: 5920/20000, Loss: 0.00009394\n",
      "Epoch: 5930/20000, Loss: 0.00008807\n",
      "Epoch: 5940/20000, Loss: 0.00008648\n",
      "Epoch: 5950/20000, Loss: 0.00008800\n",
      "Epoch: 5960/20000, Loss: 0.00008738\n",
      "Epoch: 5970/20000, Loss: 0.00009707\n",
      "Epoch: 5980/20000, Loss: 0.00012447\n",
      "Epoch: 5990/20000, Loss: 0.00012096\n",
      "Epoch: 6000/20000, Loss: 0.00019503\n",
      "Epoch: 6010/20000, Loss: 0.00010961\n",
      "Epoch: 6020/20000, Loss: 0.00008741\n",
      "Epoch: 6030/20000, Loss: 0.00008497\n",
      "Epoch: 6040/20000, Loss: 0.00008390\n",
      "Epoch: 6050/20000, Loss: 0.00008429\n",
      "Epoch: 6060/20000, Loss: 0.00010275\n",
      "Epoch: 6070/20000, Loss: 0.00021856\n",
      "Epoch: 6080/20000, Loss: 0.00011866\n",
      "Epoch: 6090/20000, Loss: 0.00009727\n",
      "Epoch: 6100/20000, Loss: 0.00008762\n",
      "Epoch: 6110/20000, Loss: 0.00008688\n",
      "Epoch: 6120/20000, Loss: 0.00008556\n",
      "Epoch: 6130/20000, Loss: 0.00010599\n",
      "Epoch: 6140/20000, Loss: 0.00016495\n",
      "Epoch: 6150/20000, Loss: 0.00010767\n",
      "Epoch: 6160/20000, Loss: 0.00009085\n",
      "Epoch: 6170/20000, Loss: 0.00011721\n",
      "Epoch: 6180/20000, Loss: 0.00012058\n",
      "Epoch: 6190/20000, Loss: 0.00009058\n",
      "Epoch: 6200/20000, Loss: 0.00008541\n",
      "Epoch: 6210/20000, Loss: 0.00008100\n",
      "Epoch: 6220/20000, Loss: 0.00007999\n",
      "Epoch: 6230/20000, Loss: 0.00009595\n",
      "Epoch: 6240/20000, Loss: 0.00029996\n",
      "Epoch: 6250/20000, Loss: 0.00012640\n",
      "Epoch: 6260/20000, Loss: 0.00010165\n",
      "Epoch: 6270/20000, Loss: 0.00009118\n",
      "Epoch: 6280/20000, Loss: 0.00008435\n",
      "Epoch: 6290/20000, Loss: 0.00007926\n",
      "Epoch: 6300/20000, Loss: 0.00007859\n",
      "Epoch: 6310/20000, Loss: 0.00008090\n",
      "Epoch: 6320/20000, Loss: 0.00009915\n",
      "Epoch: 6330/20000, Loss: 0.00016250\n",
      "Epoch: 6340/20000, Loss: 0.00013038\n",
      "Epoch: 6350/20000, Loss: 0.00009534\n",
      "Epoch: 6360/20000, Loss: 0.00008832\n",
      "Epoch: 6370/20000, Loss: 0.00008377\n",
      "Epoch: 6380/20000, Loss: 0.00007749\n",
      "Epoch: 6390/20000, Loss: 0.00007920\n",
      "Epoch: 6400/20000, Loss: 0.00013303\n",
      "Epoch: 6410/20000, Loss: 0.00011350\n",
      "Epoch: 6420/20000, Loss: 0.00008874\n",
      "Epoch: 6430/20000, Loss: 0.00008376\n",
      "Epoch: 6440/20000, Loss: 0.00008502\n",
      "Epoch: 6450/20000, Loss: 0.00011701\n",
      "Epoch: 6460/20000, Loss: 0.00008369\n",
      "Epoch: 6470/20000, Loss: 0.00008101\n",
      "Epoch: 6480/20000, Loss: 0.00007656\n",
      "Epoch: 6490/20000, Loss: 0.00007722\n",
      "Epoch: 6500/20000, Loss: 0.00020302\n",
      "Epoch: 6510/20000, Loss: 0.00015969\n",
      "Epoch: 6520/20000, Loss: 0.00008814\n",
      "Epoch: 6530/20000, Loss: 0.00008588\n",
      "Epoch: 6540/20000, Loss: 0.00024552\n",
      "Epoch: 6550/20000, Loss: 0.00011897\n",
      "Epoch: 6560/20000, Loss: 0.00009961\n",
      "Epoch: 6570/20000, Loss: 0.00007985\n",
      "Epoch: 6580/20000, Loss: 0.00007352\n",
      "Epoch: 6590/20000, Loss: 0.00007415\n",
      "Epoch: 6600/20000, Loss: 0.00007348\n",
      "Epoch: 6610/20000, Loss: 0.00007854\n",
      "Epoch: 6620/20000, Loss: 0.00007903\n",
      "Epoch: 6630/20000, Loss: 0.00010776\n",
      "Epoch: 6640/20000, Loss: 0.00015197\n",
      "Epoch: 6650/20000, Loss: 0.00008259\n",
      "Epoch: 6660/20000, Loss: 0.00008648\n",
      "Epoch: 6670/20000, Loss: 0.00007986\n",
      "Epoch: 6680/20000, Loss: 0.00007485\n",
      "Epoch: 6690/20000, Loss: 0.00007627\n",
      "Epoch: 6700/20000, Loss: 0.00007700\n",
      "Epoch: 6710/20000, Loss: 0.00015459\n",
      "Epoch: 6720/20000, Loss: 0.00012683\n",
      "Epoch: 6730/20000, Loss: 0.00008402\n",
      "Epoch: 6740/20000, Loss: 0.00008315\n",
      "Epoch: 6750/20000, Loss: 0.00018965\n",
      "Epoch: 6760/20000, Loss: 0.00011179\n",
      "Epoch: 6770/20000, Loss: 0.00009243\n",
      "Epoch: 6780/20000, Loss: 0.00007518\n",
      "Epoch: 6790/20000, Loss: 0.00007256\n",
      "Epoch: 6800/20000, Loss: 0.00007284\n",
      "Epoch: 6810/20000, Loss: 0.00007221\n",
      "Epoch: 6820/20000, Loss: 0.00007263\n",
      "Epoch: 6830/20000, Loss: 0.00007592\n",
      "Epoch: 6840/20000, Loss: 0.00010123\n",
      "Epoch: 6850/20000, Loss: 0.00013105\n",
      "Epoch: 6860/20000, Loss: 0.00020998\n",
      "Epoch: 6870/20000, Loss: 0.00010805\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 6880/20000, Loss: 0.00007695\n",
      "Epoch: 6890/20000, Loss: 0.00007156\n",
      "Epoch: 6900/20000, Loss: 0.00006950\n",
      "Epoch: 6910/20000, Loss: 0.00006880\n",
      "Epoch: 6920/20000, Loss: 0.00007075\n",
      "Epoch: 6930/20000, Loss: 0.00007080\n",
      "Epoch: 6940/20000, Loss: 0.00007596\n",
      "Epoch: 6950/20000, Loss: 0.00012802\n",
      "Epoch: 6960/20000, Loss: 0.00015224\n",
      "Epoch: 6970/20000, Loss: 0.00010804\n",
      "Epoch: 6980/20000, Loss: 0.00007929\n",
      "Epoch: 6990/20000, Loss: 0.00007213\n",
      "Epoch: 7000/20000, Loss: 0.00007123\n",
      "Epoch: 7010/20000, Loss: 0.00006821\n",
      "Epoch: 7020/20000, Loss: 0.00006805\n",
      "Epoch: 7030/20000, Loss: 0.00007375\n",
      "Epoch: 7040/20000, Loss: 0.00015502\n",
      "Epoch: 7050/20000, Loss: 0.00010184\n",
      "Epoch: 7060/20000, Loss: 0.00009751\n",
      "Epoch: 7070/20000, Loss: 0.00007919\n",
      "Epoch: 7080/20000, Loss: 0.00007113\n",
      "Epoch: 7090/20000, Loss: 0.00006832\n",
      "Epoch: 7100/20000, Loss: 0.00006841\n",
      "Epoch: 7110/20000, Loss: 0.00008944\n",
      "Epoch: 7120/20000, Loss: 0.00011836\n",
      "Epoch: 7130/20000, Loss: 0.00007397\n",
      "Epoch: 7140/20000, Loss: 0.00009842\n",
      "Epoch: 7150/20000, Loss: 0.00014675\n",
      "Epoch: 7160/20000, Loss: 0.00007913\n",
      "Epoch: 7170/20000, Loss: 0.00007649\n",
      "Epoch: 7180/20000, Loss: 0.00007280\n",
      "Epoch: 7190/20000, Loss: 0.00007087\n",
      "Epoch: 7200/20000, Loss: 0.00006932\n",
      "Epoch: 7210/20000, Loss: 0.00007445\n",
      "Epoch: 7220/20000, Loss: 0.00016846\n",
      "Epoch: 7230/20000, Loss: 0.00012140\n",
      "Epoch: 7240/20000, Loss: 0.00007900\n",
      "Epoch: 7250/20000, Loss: 0.00007023\n",
      "Epoch: 7260/20000, Loss: 0.00009532\n",
      "Epoch: 7270/20000, Loss: 0.00012345\n",
      "Epoch: 7280/20000, Loss: 0.00007861\n",
      "Epoch: 7290/20000, Loss: 0.00006884\n",
      "Epoch: 7300/20000, Loss: 0.00006647\n",
      "Epoch: 7310/20000, Loss: 0.00006637\n",
      "Epoch: 7320/20000, Loss: 0.00007007\n",
      "Epoch: 7330/20000, Loss: 0.00017365\n",
      "Epoch: 7340/20000, Loss: 0.00013979\n",
      "Epoch: 7350/20000, Loss: 0.00008292\n",
      "Epoch: 7360/20000, Loss: 0.00007575\n",
      "Epoch: 7370/20000, Loss: 0.00008196\n",
      "Epoch: 7380/20000, Loss: 0.00008374\n",
      "Epoch: 7390/20000, Loss: 0.00007206\n",
      "Epoch: 7400/20000, Loss: 0.00006891\n",
      "Epoch: 7410/20000, Loss: 0.00008952\n",
      "Epoch: 7420/20000, Loss: 0.00017426\n",
      "Epoch: 7430/20000, Loss: 0.00009168\n",
      "Epoch: 7440/20000, Loss: 0.00007563\n",
      "Epoch: 7450/20000, Loss: 0.00007014\n",
      "Epoch: 7460/20000, Loss: 0.00006737\n",
      "Epoch: 7470/20000, Loss: 0.00007126\n",
      "Epoch: 7480/20000, Loss: 0.00015025\n",
      "Epoch: 7490/20000, Loss: 0.00013792\n",
      "Epoch: 7500/20000, Loss: 0.00009065\n",
      "Epoch: 7510/20000, Loss: 0.00007304\n",
      "Epoch: 7520/20000, Loss: 0.00007369\n",
      "Epoch: 7530/20000, Loss: 0.00007386\n",
      "Epoch: 7540/20000, Loss: 0.00008771\n",
      "Epoch: 7550/20000, Loss: 0.00010751\n",
      "Epoch: 7560/20000, Loss: 0.00006919\n",
      "Epoch: 7570/20000, Loss: 0.00007173\n",
      "Epoch: 7580/20000, Loss: 0.00007239\n",
      "Epoch: 7590/20000, Loss: 0.00011789\n",
      "Epoch: 7600/20000, Loss: 0.00010888\n",
      "Epoch: 7610/20000, Loss: 0.00007655\n",
      "Epoch: 7620/20000, Loss: 0.00007587\n",
      "Epoch: 7630/20000, Loss: 0.00006834\n",
      "Epoch: 7640/20000, Loss: 0.00006594\n",
      "Epoch: 7650/20000, Loss: 0.00008963\n",
      "Epoch: 7660/20000, Loss: 0.00016433\n",
      "Epoch: 7670/20000, Loss: 0.00008661\n",
      "Epoch: 7680/20000, Loss: 0.00006905\n",
      "Epoch: 7690/20000, Loss: 0.00006686\n",
      "Epoch: 7700/20000, Loss: 0.00006523\n",
      "Epoch: 7710/20000, Loss: 0.00006488\n",
      "Epoch: 7720/20000, Loss: 0.00006736\n",
      "Epoch: 7730/20000, Loss: 0.00014581\n",
      "Epoch: 7740/20000, Loss: 0.00018113\n",
      "Epoch: 7750/20000, Loss: 0.00007979\n",
      "Epoch: 7760/20000, Loss: 0.00008031\n",
      "Epoch: 7770/20000, Loss: 0.00006591\n",
      "Epoch: 7780/20000, Loss: 0.00006274\n",
      "Epoch: 7790/20000, Loss: 0.00006168\n",
      "Epoch: 7800/20000, Loss: 0.00006178\n",
      "Epoch: 7810/20000, Loss: 0.00006193\n",
      "Epoch: 7820/20000, Loss: 0.00006773\n",
      "Epoch: 7830/20000, Loss: 0.00017050\n",
      "Epoch: 7840/20000, Loss: 0.00010763\n",
      "Epoch: 7850/20000, Loss: 0.00009881\n",
      "Epoch: 7860/20000, Loss: 0.00007029\n",
      "Epoch: 7870/20000, Loss: 0.00006477\n",
      "Epoch: 7880/20000, Loss: 0.00006428\n",
      "Epoch: 7890/20000, Loss: 0.00008632\n",
      "Epoch: 7900/20000, Loss: 0.00009002\n",
      "Epoch: 7910/20000, Loss: 0.00006637\n",
      "Epoch: 7920/20000, Loss: 0.00006306\n",
      "Epoch: 7930/20000, Loss: 0.00006788\n",
      "Epoch: 7940/20000, Loss: 0.00019224\n",
      "Epoch: 7950/20000, Loss: 0.00011278\n",
      "Epoch: 7960/20000, Loss: 0.00008155\n",
      "Epoch: 7970/20000, Loss: 0.00006998\n",
      "Epoch: 7980/20000, Loss: 0.00006700\n",
      "Epoch: 7990/20000, Loss: 0.00008539\n",
      "Epoch: 8000/20000, Loss: 0.00008901\n",
      "Epoch: 8010/20000, Loss: 0.00006932\n",
      "Epoch: 8020/20000, Loss: 0.00006349\n",
      "Epoch: 8030/20000, Loss: 0.00007031\n",
      "Epoch: 8040/20000, Loss: 0.00023690\n",
      "Epoch: 8050/20000, Loss: 0.00011527\n",
      "Epoch: 8060/20000, Loss: 0.00007274\n",
      "Epoch: 8070/20000, Loss: 0.00006587\n",
      "Epoch: 8080/20000, Loss: 0.00006430\n",
      "Epoch: 8090/20000, Loss: 0.00006456\n",
      "Epoch: 8100/20000, Loss: 0.00007649\n",
      "Epoch: 8110/20000, Loss: 0.00013659\n",
      "Epoch: 8120/20000, Loss: 0.00007830\n",
      "Epoch: 8130/20000, Loss: 0.00006241\n",
      "Epoch: 8140/20000, Loss: 0.00006645\n",
      "Epoch: 8150/20000, Loss: 0.00023808\n",
      "Epoch: 8160/20000, Loss: 0.00011987\n",
      "Epoch: 8170/20000, Loss: 0.00006661\n",
      "Epoch: 8180/20000, Loss: 0.00006364\n",
      "Epoch: 8190/20000, Loss: 0.00006436\n",
      "Epoch: 8200/20000, Loss: 0.00007349\n",
      "Epoch: 8210/20000, Loss: 0.00014416\n",
      "Epoch: 8220/20000, Loss: 0.00008123\n",
      "Epoch: 8230/20000, Loss: 0.00006567\n",
      "Epoch: 8240/20000, Loss: 0.00006073\n",
      "Epoch: 8250/20000, Loss: 0.00005999\n",
      "Epoch: 8260/20000, Loss: 0.00008044\n",
      "Epoch: 8270/20000, Loss: 0.00019683\n",
      "Epoch: 8280/20000, Loss: 0.00007138\n",
      "Epoch: 8290/20000, Loss: 0.00007983\n",
      "Epoch: 8300/20000, Loss: 0.00006328\n",
      "Epoch: 8310/20000, Loss: 0.00005951\n",
      "Epoch: 8320/20000, Loss: 0.00006383\n",
      "Epoch: 8330/20000, Loss: 0.00018000\n",
      "Epoch: 8340/20000, Loss: 0.00010192\n",
      "Epoch: 8350/20000, Loss: 0.00006364\n",
      "Epoch: 8360/20000, Loss: 0.00006359\n",
      "Epoch: 8370/20000, Loss: 0.00006061\n",
      "Epoch: 8380/20000, Loss: 0.00005878\n",
      "Epoch: 8390/20000, Loss: 0.00005899\n",
      "Epoch: 8400/20000, Loss: 0.00006503\n",
      "Epoch: 8410/20000, Loss: 0.00051196\n",
      "Epoch: 8420/20000, Loss: 0.00011745\n",
      "Epoch: 8430/20000, Loss: 0.00008214\n",
      "Epoch: 8440/20000, Loss: 0.00006534\n",
      "Epoch: 8450/20000, Loss: 0.00005914\n",
      "Epoch: 8460/20000, Loss: 0.00005927\n",
      "Epoch: 8470/20000, Loss: 0.00005801\n",
      "Epoch: 8480/20000, Loss: 0.00005901\n",
      "Epoch: 8490/20000, Loss: 0.00006164\n",
      "Epoch: 8500/20000, Loss: 0.00006405\n",
      "Epoch: 8510/20000, Loss: 0.00016671\n",
      "Epoch: 8520/20000, Loss: 0.00015532\n",
      "Epoch: 8530/20000, Loss: 0.00009094\n",
      "Epoch: 8540/20000, Loss: 0.00006673\n",
      "Epoch: 8550/20000, Loss: 0.00005868\n",
      "Epoch: 8560/20000, Loss: 0.00005814\n",
      "Epoch: 8570/20000, Loss: 0.00005697\n",
      "Epoch: 8580/20000, Loss: 0.00005706\n",
      "Epoch: 8590/20000, Loss: 0.00005721\n",
      "Epoch: 8600/20000, Loss: 0.00005991\n",
      "Epoch: 8610/20000, Loss: 0.00016927\n",
      "Epoch: 8620/20000, Loss: 0.00011858\n",
      "Epoch: 8630/20000, Loss: 0.00008116\n",
      "Epoch: 8640/20000, Loss: 0.00005990\n",
      "Epoch: 8650/20000, Loss: 0.00005989\n",
      "Epoch: 8660/20000, Loss: 0.00005870\n",
      "Epoch: 8670/20000, Loss: 0.00005736\n",
      "Epoch: 8680/20000, Loss: 0.00005951\n",
      "Epoch: 8690/20000, Loss: 0.00006133\n",
      "Epoch: 8700/20000, Loss: 0.00007737\n",
      "Epoch: 8710/20000, Loss: 0.00019835\n",
      "Epoch: 8720/20000, Loss: 0.00007869\n",
      "Epoch: 8730/20000, Loss: 0.00006385\n",
      "Epoch: 8740/20000, Loss: 0.00006308\n",
      "Epoch: 8750/20000, Loss: 0.00005852\n",
      "Epoch: 8760/20000, Loss: 0.00005819\n",
      "Epoch: 8770/20000, Loss: 0.00008053\n",
      "Epoch: 8780/20000, Loss: 0.00012774\n",
      "Epoch: 8790/20000, Loss: 0.00007747\n",
      "Epoch: 8800/20000, Loss: 0.00006285\n",
      "Epoch: 8810/20000, Loss: 0.00005664\n",
      "Epoch: 8820/20000, Loss: 0.00005884\n",
      "Epoch: 8830/20000, Loss: 0.00006264\n",
      "Epoch: 8840/20000, Loss: 0.00011086\n",
      "Epoch: 8850/20000, Loss: 0.00014350\n",
      "Epoch: 8860/20000, Loss: 0.00009040\n",
      "Epoch: 8870/20000, Loss: 0.00008650\n",
      "Epoch: 8880/20000, Loss: 0.00006260\n",
      "Epoch: 8890/20000, Loss: 0.00005842\n",
      "Epoch: 8900/20000, Loss: 0.00005580\n",
      "Epoch: 8910/20000, Loss: 0.00005657\n",
      "Epoch: 8920/20000, Loss: 0.00005851\n",
      "Epoch: 8930/20000, Loss: 0.00006582\n",
      "Epoch: 8940/20000, Loss: 0.00025197\n",
      "Epoch: 8950/20000, Loss: 0.00014070\n",
      "Epoch: 8960/20000, Loss: 0.00008232\n",
      "Epoch: 8970/20000, Loss: 0.00006907\n",
      "Epoch: 8980/20000, Loss: 0.00005944\n",
      "Epoch: 8990/20000, Loss: 0.00005512\n",
      "Epoch: 9000/20000, Loss: 0.00005434\n",
      "Epoch: 9010/20000, Loss: 0.00005399\n",
      "Epoch: 9020/20000, Loss: 0.00005490\n",
      "Epoch: 9030/20000, Loss: 0.00011929\n",
      "Epoch: 9040/20000, Loss: 0.00007670\n",
      "Epoch: 9050/20000, Loss: 0.00010904\n",
      "Epoch: 9060/20000, Loss: 0.00005960\n",
      "Epoch: 9070/20000, Loss: 0.00005927\n",
      "Epoch: 9080/20000, Loss: 0.00005655\n",
      "Epoch: 9090/20000, Loss: 0.00005539\n",
      "Epoch: 9100/20000, Loss: 0.00005680\n",
      "Epoch: 9110/20000, Loss: 0.00006388\n",
      "Epoch: 9120/20000, Loss: 0.00025289\n",
      "Epoch: 9130/20000, Loss: 0.00008769\n",
      "Epoch: 9140/20000, Loss: 0.00007840\n",
      "Epoch: 9150/20000, Loss: 0.00005855\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 9160/20000, Loss: 0.00005733\n",
      "Epoch: 9170/20000, Loss: 0.00005610\n",
      "Epoch: 9180/20000, Loss: 0.00005448\n",
      "Epoch: 9190/20000, Loss: 0.00005705\n",
      "Epoch: 9200/20000, Loss: 0.00005766\n",
      "Epoch: 9210/20000, Loss: 0.00013910\n",
      "Epoch: 9220/20000, Loss: 0.00010384\n",
      "Epoch: 9230/20000, Loss: 0.00009700\n",
      "Epoch: 9240/20000, Loss: 0.00006006\n",
      "Epoch: 9250/20000, Loss: 0.00005832\n",
      "Epoch: 9260/20000, Loss: 0.00005844\n",
      "Epoch: 9270/20000, Loss: 0.00005673\n",
      "Epoch: 9280/20000, Loss: 0.00007986\n",
      "Epoch: 9290/20000, Loss: 0.00010781\n",
      "Epoch: 9300/20000, Loss: 0.00007303\n",
      "Epoch: 9310/20000, Loss: 0.00007235\n",
      "Epoch: 9320/20000, Loss: 0.00005760\n",
      "Epoch: 9330/20000, Loss: 0.00006318\n",
      "Epoch: 9340/20000, Loss: 0.00013612\n",
      "Epoch: 9350/20000, Loss: 0.00006604\n",
      "Epoch: 9360/20000, Loss: 0.00006024\n",
      "Epoch: 9370/20000, Loss: 0.00005714\n",
      "Epoch: 9380/20000, Loss: 0.00005672\n",
      "Epoch: 9390/20000, Loss: 0.00005841\n",
      "Epoch: 9400/20000, Loss: 0.00006695\n",
      "Epoch: 9410/20000, Loss: 0.00023835\n",
      "Epoch: 9420/20000, Loss: 0.00011379\n",
      "Epoch: 9430/20000, Loss: 0.00006618\n",
      "Epoch: 9440/20000, Loss: 0.00006065\n",
      "Epoch: 9450/20000, Loss: 0.00005697\n",
      "Epoch: 9460/20000, Loss: 0.00005465\n",
      "Epoch: 9470/20000, Loss: 0.00005569\n",
      "Epoch: 9480/20000, Loss: 0.00005806\n",
      "Epoch: 9490/20000, Loss: 0.00008093\n",
      "Epoch: 9500/20000, Loss: 0.00017118\n",
      "Epoch: 9510/20000, Loss: 0.00007258\n",
      "Epoch: 9520/20000, Loss: 0.00008404\n",
      "Epoch: 9530/20000, Loss: 0.00007040\n",
      "Epoch: 9540/20000, Loss: 0.00006117\n",
      "Epoch: 9550/20000, Loss: 0.00005687\n",
      "Epoch: 9560/20000, Loss: 0.00006427\n",
      "Epoch: 9570/20000, Loss: 0.00012844\n",
      "Epoch: 9580/20000, Loss: 0.00008148\n",
      "Epoch: 9590/20000, Loss: 0.00006154\n",
      "Epoch: 9600/20000, Loss: 0.00006200\n",
      "Epoch: 9610/20000, Loss: 0.00009700\n",
      "Epoch: 9620/20000, Loss: 0.00007258\n",
      "Epoch: 9630/20000, Loss: 0.00006238\n",
      "Epoch: 9640/20000, Loss: 0.00005871\n",
      "Epoch: 9650/20000, Loss: 0.00006556\n",
      "Epoch: 9660/20000, Loss: 0.00009610\n",
      "Epoch: 9670/20000, Loss: 0.00015185\n",
      "Epoch: 9680/20000, Loss: 0.00007189\n",
      "Epoch: 9690/20000, Loss: 0.00005885\n",
      "Epoch: 9700/20000, Loss: 0.00005578\n",
      "Epoch: 9710/20000, Loss: 0.00005513\n",
      "Epoch: 9720/20000, Loss: 0.00005679\n",
      "Epoch: 9730/20000, Loss: 0.00006844\n",
      "Epoch: 9740/20000, Loss: 0.00032459\n",
      "Epoch: 9750/20000, Loss: 0.00011322\n",
      "Epoch: 9760/20000, Loss: 0.00007414\n",
      "Epoch: 9770/20000, Loss: 0.00006260\n",
      "Epoch: 9780/20000, Loss: 0.00006476\n",
      "Epoch: 9790/20000, Loss: 0.00016178\n",
      "Epoch: 9800/20000, Loss: 0.00009001\n",
      "Epoch: 9810/20000, Loss: 0.00007908\n",
      "Epoch: 9820/20000, Loss: 0.00006115\n",
      "Epoch: 9830/20000, Loss: 0.00005402\n",
      "Epoch: 9840/20000, Loss: 0.00005321\n",
      "Epoch: 9850/20000, Loss: 0.00009978\n",
      "Epoch: 9860/20000, Loss: 0.00007061\n",
      "Epoch: 9870/20000, Loss: 0.00010273\n",
      "Epoch: 9880/20000, Loss: 0.00007076\n",
      "Epoch: 9890/20000, Loss: 0.00006121\n",
      "Epoch: 9900/20000, Loss: 0.00005736\n",
      "Epoch: 9910/20000, Loss: 0.00005529\n",
      "Epoch: 9920/20000, Loss: 0.00005598\n",
      "Epoch: 9930/20000, Loss: 0.00007553\n",
      "Epoch: 9940/20000, Loss: 0.00010179\n",
      "Epoch: 9950/20000, Loss: 0.00012089\n",
      "Epoch: 9960/20000, Loss: 0.00006129\n",
      "Epoch: 9970/20000, Loss: 0.00006052\n",
      "Epoch: 9980/20000, Loss: 0.00005801\n",
      "Epoch: 9990/20000, Loss: 0.00005374\n",
      "Epoch: 10000/20000, Loss: 0.00005322\n",
      "Epoch: 10010/20000, Loss: 0.00005333\n",
      "Epoch: 10020/20000, Loss: 0.00007486\n",
      "Epoch: 10030/20000, Loss: 0.00022160\n",
      "Epoch: 10040/20000, Loss: 0.00009272\n",
      "Epoch: 10050/20000, Loss: 0.00008137\n",
      "Epoch: 10060/20000, Loss: 0.00005973\n",
      "Epoch: 10070/20000, Loss: 0.00005572\n",
      "Epoch: 10080/20000, Loss: 0.00005373\n",
      "Epoch: 10090/20000, Loss: 0.00005399\n",
      "Epoch: 10100/20000, Loss: 0.00005497\n",
      "Epoch: 10110/20000, Loss: 0.00006328\n",
      "Epoch: 10120/20000, Loss: 0.00020289\n",
      "Epoch: 10130/20000, Loss: 0.00006688\n",
      "Epoch: 10140/20000, Loss: 0.00006360\n",
      "Epoch: 10150/20000, Loss: 0.00005961\n",
      "Epoch: 10160/20000, Loss: 0.00011353\n",
      "Epoch: 10170/20000, Loss: 0.00006633\n",
      "Epoch: 10180/20000, Loss: 0.00007217\n",
      "Epoch: 10190/20000, Loss: 0.00006274\n",
      "Epoch: 10200/20000, Loss: 0.00005569\n",
      "Epoch: 10210/20000, Loss: 0.00005356\n",
      "Epoch: 10220/20000, Loss: 0.00005262\n",
      "Epoch: 10230/20000, Loss: 0.00005621\n",
      "Epoch: 10240/20000, Loss: 0.00005782\n",
      "Epoch: 10250/20000, Loss: 0.00006819\n",
      "Epoch: 10260/20000, Loss: 0.00020899\n",
      "Epoch: 10270/20000, Loss: 0.00011049\n",
      "Epoch: 10280/20000, Loss: 0.00007251\n",
      "Epoch: 10290/20000, Loss: 0.00005639\n",
      "Epoch: 10300/20000, Loss: 0.00005567\n",
      "Epoch: 10310/20000, Loss: 0.00005304\n",
      "Epoch: 10320/20000, Loss: 0.00005174\n",
      "Epoch: 10330/20000, Loss: 0.00005464\n",
      "Epoch: 10340/20000, Loss: 0.00013314\n",
      "Epoch: 10350/20000, Loss: 0.00007889\n",
      "Epoch: 10360/20000, Loss: 0.00010376\n",
      "Epoch: 10370/20000, Loss: 0.00005696\n",
      "Epoch: 10380/20000, Loss: 0.00005705\n",
      "Epoch: 10390/20000, Loss: 0.00005630\n",
      "Epoch: 10400/20000, Loss: 0.00005561\n",
      "Epoch: 10410/20000, Loss: 0.00005799\n",
      "Epoch: 10420/20000, Loss: 0.00005509\n",
      "Epoch: 10430/20000, Loss: 0.00005971\n",
      "Epoch: 10440/20000, Loss: 0.00006884\n",
      "Epoch: 10450/20000, Loss: 0.00028192\n",
      "Epoch: 10460/20000, Loss: 0.00010740\n",
      "Epoch: 10470/20000, Loss: 0.00007928\n",
      "Epoch: 10480/20000, Loss: 0.00005782\n",
      "Epoch: 10490/20000, Loss: 0.00005501\n",
      "Epoch: 10500/20000, Loss: 0.00006727\n",
      "Epoch: 10510/20000, Loss: 0.00006857\n",
      "Epoch: 10520/20000, Loss: 0.00005315\n",
      "Epoch: 10530/20000, Loss: 0.00005688\n",
      "Epoch: 10540/20000, Loss: 0.00006997\n",
      "Epoch: 10550/20000, Loss: 0.00009383\n",
      "Epoch: 10560/20000, Loss: 0.00005288\n",
      "Epoch: 10570/20000, Loss: 0.00005972\n",
      "Epoch: 10580/20000, Loss: 0.00006001\n",
      "Epoch: 10590/20000, Loss: 0.00007819\n",
      "Epoch: 10600/20000, Loss: 0.00011929\n",
      "Epoch: 10610/20000, Loss: 0.00007833\n",
      "Epoch: 10620/20000, Loss: 0.00006707\n",
      "Epoch: 10630/20000, Loss: 0.00010206\n",
      "Epoch: 10640/20000, Loss: 0.00010392\n",
      "Epoch: 10650/20000, Loss: 0.00007171\n",
      "Epoch: 10660/20000, Loss: 0.00005922\n",
      "Epoch: 10670/20000, Loss: 0.00005266\n",
      "Epoch: 10680/20000, Loss: 0.00005396\n",
      "Epoch: 10690/20000, Loss: 0.00022656\n",
      "Epoch: 10700/20000, Loss: 0.00010386\n",
      "Epoch: 10710/20000, Loss: 0.00007030\n",
      "Epoch: 10720/20000, Loss: 0.00005624\n",
      "Epoch: 10730/20000, Loss: 0.00005219\n",
      "Epoch: 10740/20000, Loss: 0.00005334\n",
      "Epoch: 10750/20000, Loss: 0.00010417\n",
      "Epoch: 10760/20000, Loss: 0.00009973\n",
      "Epoch: 10770/20000, Loss: 0.00007168\n",
      "Epoch: 10780/20000, Loss: 0.00006670\n",
      "Epoch: 10790/20000, Loss: 0.00005717\n",
      "Epoch: 10800/20000, Loss: 0.00005267\n",
      "Epoch: 10810/20000, Loss: 0.00005268\n",
      "Epoch: 10820/20000, Loss: 0.00005289\n",
      "Epoch: 10830/20000, Loss: 0.00005496\n",
      "Epoch: 10840/20000, Loss: 0.00008268\n",
      "Epoch: 10850/20000, Loss: 0.00010075\n",
      "Epoch: 10860/20000, Loss: 0.00008812\n",
      "Epoch: 10870/20000, Loss: 0.00006061\n",
      "Epoch: 10880/20000, Loss: 0.00005468\n",
      "Epoch: 10890/20000, Loss: 0.00008042\n",
      "Epoch: 10900/20000, Loss: 0.00010607\n",
      "Epoch: 10910/20000, Loss: 0.00006506\n",
      "Epoch: 10920/20000, Loss: 0.00005572\n",
      "Epoch: 10930/20000, Loss: 0.00005388\n",
      "Epoch: 10940/20000, Loss: 0.00005442\n",
      "Epoch: 10950/20000, Loss: 0.00007873\n",
      "Epoch: 10960/20000, Loss: 0.00010006\n",
      "Epoch: 10970/20000, Loss: 0.00006404\n",
      "Epoch: 10980/20000, Loss: 0.00007516\n",
      "Epoch: 10990/20000, Loss: 0.00017832\n",
      "Epoch: 11000/20000, Loss: 0.00006605\n",
      "Epoch: 11010/20000, Loss: 0.00006472\n",
      "Epoch: 11020/20000, Loss: 0.00005748\n",
      "Epoch: 11030/20000, Loss: 0.00005300\n",
      "Epoch: 11040/20000, Loss: 0.00005464\n",
      "Epoch: 11050/20000, Loss: 0.00006188\n",
      "Epoch: 11060/20000, Loss: 0.00015139\n",
      "Epoch: 11070/20000, Loss: 0.00008605\n",
      "Epoch: 11080/20000, Loss: 0.00005621\n",
      "Epoch: 11090/20000, Loss: 0.00005326\n",
      "Epoch: 11100/20000, Loss: 0.00007328\n",
      "Epoch: 11110/20000, Loss: 0.00014999\n",
      "Epoch: 11120/20000, Loss: 0.00006667\n",
      "Epoch: 11130/20000, Loss: 0.00005639\n",
      "Epoch: 11140/20000, Loss: 0.00005385\n",
      "Epoch: 11150/20000, Loss: 0.00005329\n",
      "Epoch: 11160/20000, Loss: 0.00005560\n",
      "Epoch: 11170/20000, Loss: 0.00005640\n",
      "Epoch: 11180/20000, Loss: 0.00013633\n",
      "Epoch: 11190/20000, Loss: 0.00012016\n",
      "Epoch: 11200/20000, Loss: 0.00006561\n",
      "Epoch: 11210/20000, Loss: 0.00007208\n",
      "Epoch: 11220/20000, Loss: 0.00020101\n",
      "Epoch: 11230/20000, Loss: 0.00008657\n",
      "Epoch: 11240/20000, Loss: 0.00005499\n",
      "Epoch: 11250/20000, Loss: 0.00005316\n",
      "Epoch: 11260/20000, Loss: 0.00005188\n",
      "Epoch: 11270/20000, Loss: 0.00005140\n",
      "Epoch: 11280/20000, Loss: 0.00005340\n",
      "Epoch: 11290/20000, Loss: 0.00005635\n",
      "Epoch: 11300/20000, Loss: 0.00005725\n",
      "Epoch: 11310/20000, Loss: 0.00006409\n",
      "Epoch: 11320/20000, Loss: 0.00010180\n",
      "Epoch: 11330/20000, Loss: 0.00017070\n",
      "Epoch: 11340/20000, Loss: 0.00007048\n",
      "Epoch: 11350/20000, Loss: 0.00006670\n",
      "Epoch: 11360/20000, Loss: 0.00005386\n",
      "Epoch: 11370/20000, Loss: 0.00005122\n",
      "Epoch: 11380/20000, Loss: 0.00005234\n",
      "Epoch: 11390/20000, Loss: 0.00006928\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 11400/20000, Loss: 0.00017695\n",
      "Epoch: 11410/20000, Loss: 0.00008929\n",
      "Epoch: 11420/20000, Loss: 0.00006640\n",
      "Epoch: 11430/20000, Loss: 0.00005891\n",
      "Epoch: 11440/20000, Loss: 0.00005384\n",
      "Epoch: 11450/20000, Loss: 0.00005608\n",
      "Epoch: 11460/20000, Loss: 0.00005586\n",
      "Epoch: 11470/20000, Loss: 0.00005852\n",
      "Epoch: 11480/20000, Loss: 0.00006495\n",
      "Epoch: 11490/20000, Loss: 0.00032576\n",
      "Epoch: 11500/20000, Loss: 0.00013601\n",
      "Epoch: 11510/20000, Loss: 0.00009151\n",
      "Epoch: 11520/20000, Loss: 0.00005424\n",
      "Epoch: 11530/20000, Loss: 0.00005825\n",
      "Epoch: 11540/20000, Loss: 0.00005187\n",
      "Epoch: 11550/20000, Loss: 0.00005330\n",
      "Epoch: 11560/20000, Loss: 0.00008887\n",
      "Epoch: 11570/20000, Loss: 0.00007542\n",
      "Epoch: 11580/20000, Loss: 0.00006167\n",
      "Epoch: 11590/20000, Loss: 0.00005618\n",
      "Epoch: 11600/20000, Loss: 0.00005218\n",
      "Epoch: 11610/20000, Loss: 0.00005209\n",
      "Epoch: 11620/20000, Loss: 0.00005509\n",
      "Epoch: 11630/20000, Loss: 0.00005402\n",
      "Epoch: 11640/20000, Loss: 0.00006267\n",
      "Epoch: 11650/20000, Loss: 0.00029170\n",
      "Epoch: 11660/20000, Loss: 0.00016674\n",
      "Epoch: 11670/20000, Loss: 0.00007599\n",
      "Epoch: 11680/20000, Loss: 0.00005690\n",
      "Epoch: 11690/20000, Loss: 0.00005423\n",
      "Epoch: 11700/20000, Loss: 0.00005332\n",
      "Epoch: 11710/20000, Loss: 0.00005292\n",
      "Epoch: 11720/20000, Loss: 0.00005253\n",
      "Epoch: 11730/20000, Loss: 0.00005640\n",
      "Epoch: 11740/20000, Loss: 0.00005596\n",
      "Epoch: 11750/20000, Loss: 0.00014768\n",
      "Epoch: 11760/20000, Loss: 0.00009204\n",
      "Epoch: 11770/20000, Loss: 0.00009305\n",
      "Epoch: 11780/20000, Loss: 0.00006184\n",
      "Epoch: 11790/20000, Loss: 0.00005217\n",
      "Epoch: 11800/20000, Loss: 0.00005134\n",
      "Epoch: 11810/20000, Loss: 0.00005057\n",
      "Epoch: 11820/20000, Loss: 0.00004977\n",
      "Epoch: 11830/20000, Loss: 0.00005293\n",
      "Epoch: 11840/20000, Loss: 0.00005629\n",
      "Epoch: 11850/20000, Loss: 0.00005754\n",
      "Epoch: 11860/20000, Loss: 0.00005944\n",
      "Epoch: 11870/20000, Loss: 0.00005617\n",
      "Epoch: 11880/20000, Loss: 0.00005633\n",
      "Epoch: 11890/20000, Loss: 0.00007693\n",
      "Epoch: 11900/20000, Loss: 0.00038759\n",
      "Epoch: 11910/20000, Loss: 0.00010630\n",
      "Epoch: 11920/20000, Loss: 0.00006070\n",
      "Epoch: 11930/20000, Loss: 0.00005704\n",
      "Epoch: 11940/20000, Loss: 0.00005370\n",
      "Epoch: 11950/20000, Loss: 0.00005225\n",
      "Epoch: 11960/20000, Loss: 0.00005137\n",
      "Epoch: 11970/20000, Loss: 0.00005271\n",
      "Epoch: 11980/20000, Loss: 0.00009427\n",
      "Epoch: 11990/20000, Loss: 0.00006157\n",
      "Epoch: 12000/20000, Loss: 0.00005348\n",
      "Epoch: 12010/20000, Loss: 0.00005075\n",
      "Epoch: 12020/20000, Loss: 0.00005131\n",
      "Epoch: 12030/20000, Loss: 0.00005330\n",
      "Epoch: 12040/20000, Loss: 0.00005818\n",
      "Epoch: 12050/20000, Loss: 0.00007639\n",
      "Epoch: 12060/20000, Loss: 0.00010945\n",
      "Epoch: 12070/20000, Loss: 0.00007013\n",
      "Epoch: 12080/20000, Loss: 0.00005691\n",
      "Epoch: 12090/20000, Loss: 0.00005209\n",
      "Epoch: 12100/20000, Loss: 0.00006325\n",
      "Epoch: 12110/20000, Loss: 0.00012973\n",
      "Epoch: 12120/20000, Loss: 0.00006653\n",
      "Epoch: 12130/20000, Loss: 0.00006156\n",
      "Epoch: 12140/20000, Loss: 0.00016225\n",
      "Epoch: 12150/20000, Loss: 0.00007921\n",
      "Epoch: 12160/20000, Loss: 0.00006543\n",
      "Epoch: 12170/20000, Loss: 0.00005542\n",
      "Epoch: 12180/20000, Loss: 0.00005186\n",
      "Epoch: 12190/20000, Loss: 0.00005177\n",
      "Epoch: 12200/20000, Loss: 0.00005624\n",
      "Epoch: 12210/20000, Loss: 0.00017733\n",
      "Epoch: 12220/20000, Loss: 0.00009230\n",
      "Epoch: 12230/20000, Loss: 0.00006189\n",
      "Epoch: 12240/20000, Loss: 0.00013284\n",
      "Epoch: 12250/20000, Loss: 0.00006913\n",
      "Epoch: 12260/20000, Loss: 0.00007740\n",
      "Epoch: 12270/20000, Loss: 0.00005865\n",
      "Epoch: 12280/20000, Loss: 0.00005173\n",
      "Epoch: 12290/20000, Loss: 0.00005023\n",
      "Epoch: 12300/20000, Loss: 0.00005119\n",
      "Epoch: 12310/20000, Loss: 0.00009637\n",
      "Epoch: 12320/20000, Loss: 0.00007961\n",
      "Epoch: 12330/20000, Loss: 0.00006376\n",
      "Epoch: 12340/20000, Loss: 0.00005749\n",
      "Epoch: 12350/20000, Loss: 0.00007143\n",
      "Epoch: 12360/20000, Loss: 0.00012791\n",
      "Epoch: 12370/20000, Loss: 0.00007383\n",
      "Epoch: 12380/20000, Loss: 0.00005621\n",
      "Epoch: 12390/20000, Loss: 0.00005253\n",
      "Epoch: 12400/20000, Loss: 0.00008137\n",
      "Epoch: 12410/20000, Loss: 0.00007438\n",
      "Epoch: 12420/20000, Loss: 0.00005686\n",
      "Epoch: 12430/20000, Loss: 0.00005474\n",
      "Epoch: 12440/20000, Loss: 0.00011042\n",
      "Epoch: 12450/20000, Loss: 0.00007726\n",
      "Epoch: 12460/20000, Loss: 0.00008947\n",
      "Epoch: 12470/20000, Loss: 0.00005523\n",
      "Epoch: 12480/20000, Loss: 0.00005427\n",
      "Epoch: 12490/20000, Loss: 0.00005288\n",
      "Epoch: 12500/20000, Loss: 0.00005492\n",
      "Epoch: 12510/20000, Loss: 0.00011832\n",
      "Epoch: 12520/20000, Loss: 0.00008016\n",
      "Epoch: 12530/20000, Loss: 0.00006656\n",
      "Epoch: 12540/20000, Loss: 0.00005482\n",
      "Epoch: 12550/20000, Loss: 0.00005050\n",
      "Epoch: 12560/20000, Loss: 0.00005472\n",
      "Epoch: 12570/20000, Loss: 0.00012132\n",
      "Epoch: 12580/20000, Loss: 0.00006302\n",
      "Epoch: 12590/20000, Loss: 0.00006047\n",
      "Epoch: 12600/20000, Loss: 0.00005466\n",
      "Epoch: 12610/20000, Loss: 0.00005222\n",
      "Epoch: 12620/20000, Loss: 0.00005273\n",
      "Epoch: 12630/20000, Loss: 0.00007180\n",
      "Epoch: 12640/20000, Loss: 0.00010723\n",
      "Epoch: 12650/20000, Loss: 0.00008154\n",
      "Epoch: 12660/20000, Loss: 0.00005720\n",
      "Epoch: 12670/20000, Loss: 0.00009738\n",
      "Epoch: 12680/20000, Loss: 0.00007705\n",
      "Epoch: 12690/20000, Loss: 0.00007024\n",
      "Epoch: 12700/20000, Loss: 0.00006235\n",
      "Epoch: 12710/20000, Loss: 0.00005319\n",
      "Epoch: 12720/20000, Loss: 0.00005196\n",
      "Epoch: 12730/20000, Loss: 0.00005178\n",
      "Epoch: 12740/20000, Loss: 0.00005455\n",
      "Epoch: 12750/20000, Loss: 0.00005321\n",
      "Epoch: 12760/20000, Loss: 0.00005589\n",
      "Epoch: 12770/20000, Loss: 0.00005606\n",
      "Epoch: 12780/20000, Loss: 0.00007629\n",
      "Epoch: 12790/20000, Loss: 0.00021837\n",
      "Epoch: 12800/20000, Loss: 0.00008368\n",
      "Epoch: 12810/20000, Loss: 0.00007125\n",
      "Epoch: 12820/20000, Loss: 0.00005377\n",
      "Epoch: 12830/20000, Loss: 0.00005586\n",
      "Epoch: 12840/20000, Loss: 0.00008574\n",
      "Epoch: 12850/20000, Loss: 0.00006768\n",
      "Epoch: 12860/20000, Loss: 0.00006321\n",
      "Epoch: 12870/20000, Loss: 0.00005082\n",
      "Epoch: 12880/20000, Loss: 0.00005280\n",
      "Epoch: 12890/20000, Loss: 0.00007657\n",
      "Epoch: 12900/20000, Loss: 0.00013898\n",
      "Epoch: 12910/20000, Loss: 0.00008145\n",
      "Epoch: 12920/20000, Loss: 0.00006390\n",
      "Epoch: 12930/20000, Loss: 0.00005452\n",
      "Epoch: 12940/20000, Loss: 0.00005245\n",
      "Epoch: 12950/20000, Loss: 0.00005337\n",
      "Epoch: 12960/20000, Loss: 0.00005716\n",
      "Epoch: 12970/20000, Loss: 0.00008176\n",
      "Epoch: 12980/20000, Loss: 0.00017552\n",
      "Epoch: 12990/20000, Loss: 0.00010464\n",
      "Epoch: 13000/20000, Loss: 0.00007255\n",
      "Epoch: 13010/20000, Loss: 0.00005833\n",
      "Epoch: 13020/20000, Loss: 0.00005336\n",
      "Epoch: 13030/20000, Loss: 0.00004987\n",
      "Epoch: 13040/20000, Loss: 0.00005125\n",
      "Epoch: 13050/20000, Loss: 0.00005071\n",
      "Epoch: 13060/20000, Loss: 0.00005254\n",
      "Epoch: 13070/20000, Loss: 0.00014958\n",
      "Epoch: 13080/20000, Loss: 0.00015886\n",
      "Epoch: 13090/20000, Loss: 0.00008263\n",
      "Epoch: 13100/20000, Loss: 0.00006130\n",
      "Epoch: 13110/20000, Loss: 0.00007169\n",
      "Epoch: 13120/20000, Loss: 0.00017247\n",
      "Epoch: 13130/20000, Loss: 0.00006445\n",
      "Epoch: 13140/20000, Loss: 0.00006574\n",
      "Epoch: 13150/20000, Loss: 0.00005103\n",
      "Epoch: 13160/20000, Loss: 0.00005098\n",
      "Epoch: 13170/20000, Loss: 0.00005119\n",
      "Epoch: 13180/20000, Loss: 0.00005110\n",
      "Epoch: 13190/20000, Loss: 0.00005136\n",
      "Epoch: 13200/20000, Loss: 0.00005662\n",
      "Epoch: 13210/20000, Loss: 0.00005378\n",
      "Epoch: 13220/20000, Loss: 0.00006444\n",
      "Epoch: 13230/20000, Loss: 0.00006423\n",
      "Epoch: 13240/20000, Loss: 0.00008871\n",
      "Epoch: 13250/20000, Loss: 0.00009705\n",
      "Epoch: 13260/20000, Loss: 0.00005835\n",
      "Epoch: 13270/20000, Loss: 0.00005311\n",
      "Epoch: 13280/20000, Loss: 0.00005340\n",
      "Epoch: 13290/20000, Loss: 0.00010300\n",
      "Epoch: 13300/20000, Loss: 0.00007055\n",
      "Epoch: 13310/20000, Loss: 0.00006348\n",
      "Epoch: 13320/20000, Loss: 0.00005203\n",
      "Epoch: 13330/20000, Loss: 0.00004946\n",
      "Epoch: 13340/20000, Loss: 0.00005461\n",
      "Epoch: 13350/20000, Loss: 0.00020816\n",
      "Epoch: 13360/20000, Loss: 0.00010944\n",
      "Epoch: 13370/20000, Loss: 0.00006183\n",
      "Epoch: 13380/20000, Loss: 0.00005444\n",
      "Epoch: 13390/20000, Loss: 0.00005256\n",
      "Epoch: 13400/20000, Loss: 0.00005582\n",
      "Epoch: 13410/20000, Loss: 0.00009068\n",
      "Epoch: 13420/20000, Loss: 0.00006926\n",
      "Epoch: 13430/20000, Loss: 0.00006335\n",
      "Epoch: 13440/20000, Loss: 0.00005569\n",
      "Epoch: 13450/20000, Loss: 0.00005203\n",
      "Epoch: 13460/20000, Loss: 0.00007735\n",
      "Epoch: 13470/20000, Loss: 0.00012461\n",
      "Epoch: 13480/20000, Loss: 0.00006766\n",
      "Epoch: 13490/20000, Loss: 0.00005428\n",
      "Epoch: 13500/20000, Loss: 0.00005237\n",
      "Epoch: 13510/20000, Loss: 0.00005430\n",
      "Epoch: 13520/20000, Loss: 0.00009172\n",
      "Epoch: 13530/20000, Loss: 0.00006912\n",
      "Epoch: 13540/20000, Loss: 0.00005678\n",
      "Epoch: 13550/20000, Loss: 0.00005359\n",
      "Epoch: 13560/20000, Loss: 0.00008319\n",
      "Epoch: 13570/20000, Loss: 0.00011410\n",
      "Epoch: 13580/20000, Loss: 0.00006303\n",
      "Epoch: 13590/20000, Loss: 0.00005773\n",
      "Epoch: 13600/20000, Loss: 0.00005317\n",
      "Epoch: 13610/20000, Loss: 0.00005661\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 13620/20000, Loss: 0.00012508\n",
      "Epoch: 13630/20000, Loss: 0.00007401\n",
      "Epoch: 13640/20000, Loss: 0.00005936\n",
      "Epoch: 13650/20000, Loss: 0.00005123\n",
      "Epoch: 13660/20000, Loss: 0.00005169\n",
      "Epoch: 13670/20000, Loss: 0.00010419\n",
      "Epoch: 13680/20000, Loss: 0.00007488\n",
      "Epoch: 13690/20000, Loss: 0.00006806\n",
      "Epoch: 13700/20000, Loss: 0.00005971\n",
      "Epoch: 13710/20000, Loss: 0.00005393\n",
      "Epoch: 13720/20000, Loss: 0.00005770\n",
      "Epoch: 13730/20000, Loss: 0.00014488\n",
      "Epoch: 13740/20000, Loss: 0.00007720\n",
      "Epoch: 13750/20000, Loss: 0.00005565\n",
      "Epoch: 13760/20000, Loss: 0.00005092\n",
      "Epoch: 13770/20000, Loss: 0.00004985\n",
      "Epoch: 13780/20000, Loss: 0.00005144\n",
      "Epoch: 13790/20000, Loss: 0.00005514\n",
      "Epoch: 13800/20000, Loss: 0.00036582\n",
      "Epoch: 13810/20000, Loss: 0.00008742\n",
      "Epoch: 13820/20000, Loss: 0.00008142\n",
      "Epoch: 13830/20000, Loss: 0.00006352\n",
      "Epoch: 13840/20000, Loss: 0.00005496\n",
      "Epoch: 13850/20000, Loss: 0.00007312\n",
      "Epoch: 13860/20000, Loss: 0.00007299\n",
      "Epoch: 13870/20000, Loss: 0.00005750\n",
      "Epoch: 13880/20000, Loss: 0.00005200\n",
      "Epoch: 13890/20000, Loss: 0.00005008\n",
      "Epoch: 13900/20000, Loss: 0.00005001\n",
      "Epoch: 13910/20000, Loss: 0.00008895\n",
      "Epoch: 13920/20000, Loss: 0.00010080\n",
      "Epoch: 13930/20000, Loss: 0.00006723\n",
      "Epoch: 13940/20000, Loss: 0.00005823\n",
      "Epoch: 13950/20000, Loss: 0.00005130\n",
      "Epoch: 13960/20000, Loss: 0.00005308\n",
      "Epoch: 13970/20000, Loss: 0.00008610\n",
      "Epoch: 13980/20000, Loss: 0.00007844\n",
      "Epoch: 13990/20000, Loss: 0.00006433\n",
      "Epoch: 14000/20000, Loss: 0.00005479\n",
      "Epoch: 14010/20000, Loss: 0.00005199\n",
      "Epoch: 14020/20000, Loss: 0.00005446\n",
      "Epoch: 14030/20000, Loss: 0.00008110\n",
      "Epoch: 14040/20000, Loss: 0.00008592\n",
      "Epoch: 14050/20000, Loss: 0.00013749\n",
      "Epoch: 14060/20000, Loss: 0.00007166\n",
      "Epoch: 14070/20000, Loss: 0.00005554\n",
      "Epoch: 14080/20000, Loss: 0.00004998\n",
      "Epoch: 14090/20000, Loss: 0.00005211\n",
      "Epoch: 14100/20000, Loss: 0.00007636\n",
      "Epoch: 14110/20000, Loss: 0.00017688\n",
      "Epoch: 14120/20000, Loss: 0.00008045\n",
      "Epoch: 14130/20000, Loss: 0.00006191\n",
      "Epoch: 14140/20000, Loss: 0.00005167\n",
      "Epoch: 14150/20000, Loss: 0.00005151\n",
      "Epoch: 14160/20000, Loss: 0.00005145\n",
      "Epoch: 14170/20000, Loss: 0.00006079\n",
      "Epoch: 14180/20000, Loss: 0.00013882\n",
      "Epoch: 14190/20000, Loss: 0.00006434\n",
      "Epoch: 14200/20000, Loss: 0.00005632\n",
      "Epoch: 14210/20000, Loss: 0.00005378\n",
      "Epoch: 14220/20000, Loss: 0.00005868\n",
      "Epoch: 14230/20000, Loss: 0.00012015\n",
      "Epoch: 14240/20000, Loss: 0.00007285\n",
      "Epoch: 14250/20000, Loss: 0.00006012\n",
      "Epoch: 14260/20000, Loss: 0.00007908\n",
      "Epoch: 14270/20000, Loss: 0.00012604\n",
      "Epoch: 14280/20000, Loss: 0.00007195\n",
      "Epoch: 14290/20000, Loss: 0.00005662\n",
      "Epoch: 14300/20000, Loss: 0.00005289\n",
      "Epoch: 14310/20000, Loss: 0.00005468\n",
      "Epoch: 14320/20000, Loss: 0.00008588\n",
      "Epoch: 14330/20000, Loss: 0.00008421\n",
      "Epoch: 14340/20000, Loss: 0.00006377\n",
      "Epoch: 14350/20000, Loss: 0.00006627\n",
      "Epoch: 14360/20000, Loss: 0.00011979\n",
      "Epoch: 14370/20000, Loss: 0.00005477\n",
      "Epoch: 14380/20000, Loss: 0.00005464\n",
      "Epoch: 14390/20000, Loss: 0.00005340\n",
      "Epoch: 14400/20000, Loss: 0.00005087\n",
      "Epoch: 14410/20000, Loss: 0.00005637\n",
      "Epoch: 14420/20000, Loss: 0.00010796\n",
      "Epoch: 14430/20000, Loss: 0.00011954\n",
      "Epoch: 14440/20000, Loss: 0.00007517\n",
      "Epoch: 14450/20000, Loss: 0.00006166\n",
      "Epoch: 14460/20000, Loss: 0.00005188\n",
      "Epoch: 14470/20000, Loss: 0.00005203\n",
      "Epoch: 14480/20000, Loss: 0.00007702\n",
      "Epoch: 14490/20000, Loss: 0.00012119\n",
      "Epoch: 14500/20000, Loss: 0.00007325\n",
      "Epoch: 14510/20000, Loss: 0.00005838\n",
      "Epoch: 14520/20000, Loss: 0.00005333\n",
      "Epoch: 14530/20000, Loss: 0.00006437\n",
      "Epoch: 14540/20000, Loss: 0.00012823\n",
      "Epoch: 14550/20000, Loss: 0.00006026\n",
      "Epoch: 14560/20000, Loss: 0.00005377\n",
      "Epoch: 14570/20000, Loss: 0.00006051\n",
      "Epoch: 14580/20000, Loss: 0.00025639\n",
      "Epoch: 14590/20000, Loss: 0.00009060\n",
      "Epoch: 14600/20000, Loss: 0.00006262\n",
      "Epoch: 14610/20000, Loss: 0.00005484\n",
      "Epoch: 14620/20000, Loss: 0.00005046\n",
      "Epoch: 14630/20000, Loss: 0.00005126\n",
      "Epoch: 14640/20000, Loss: 0.00006428\n",
      "Epoch: 14650/20000, Loss: 0.00011709\n",
      "Epoch: 14660/20000, Loss: 0.00006414\n",
      "Epoch: 14670/20000, Loss: 0.00005690\n",
      "Epoch: 14680/20000, Loss: 0.00005106\n",
      "Epoch: 14690/20000, Loss: 0.00004944\n",
      "Epoch: 14700/20000, Loss: 0.00005024\n",
      "Epoch: 14710/20000, Loss: 0.00008970\n",
      "Epoch: 14720/20000, Loss: 0.00013250\n",
      "Epoch: 14730/20000, Loss: 0.00009722\n",
      "Epoch: 14740/20000, Loss: 0.00006120\n",
      "Epoch: 14750/20000, Loss: 0.00005610\n",
      "Epoch: 14760/20000, Loss: 0.00005538\n",
      "Epoch: 14770/20000, Loss: 0.00005461\n",
      "Epoch: 14780/20000, Loss: 0.00005229\n",
      "Epoch: 14790/20000, Loss: 0.00005357\n",
      "Epoch: 14800/20000, Loss: 0.00005473\n",
      "Epoch: 14810/20000, Loss: 0.00005600\n",
      "Epoch: 14820/20000, Loss: 0.00016027\n",
      "Epoch: 14830/20000, Loss: 0.00013656\n",
      "Epoch: 14840/20000, Loss: 0.00006192\n",
      "Epoch: 14850/20000, Loss: 0.00005718\n",
      "Epoch: 14860/20000, Loss: 0.00005996\n",
      "Epoch: 14870/20000, Loss: 0.00008988\n",
      "Epoch: 14880/20000, Loss: 0.00005402\n",
      "Epoch: 14890/20000, Loss: 0.00005698\n",
      "Epoch: 14900/20000, Loss: 0.00004944\n",
      "Epoch: 14910/20000, Loss: 0.00005172\n",
      "Epoch: 14920/20000, Loss: 0.00007227\n",
      "Epoch: 14930/20000, Loss: 0.00013555\n",
      "Epoch: 14940/20000, Loss: 0.00007152\n",
      "Epoch: 14950/20000, Loss: 0.00005495\n",
      "Epoch: 14960/20000, Loss: 0.00005410\n",
      "Epoch: 14970/20000, Loss: 0.00005370\n",
      "Epoch: 14980/20000, Loss: 0.00009697\n",
      "Epoch: 14990/20000, Loss: 0.00009575\n",
      "Epoch: 15000/20000, Loss: 0.00006821\n",
      "Epoch: 15010/20000, Loss: 0.00005550\n",
      "Epoch: 15020/20000, Loss: 0.00005944\n",
      "Epoch: 15030/20000, Loss: 0.00008407\n",
      "Epoch: 15040/20000, Loss: 0.00006641\n",
      "Epoch: 15050/20000, Loss: 0.00005774\n",
      "Epoch: 15060/20000, Loss: 0.00005971\n",
      "Epoch: 15070/20000, Loss: 0.00010555\n",
      "Epoch: 15080/20000, Loss: 0.00010320\n",
      "Epoch: 15090/20000, Loss: 0.00006859\n",
      "Epoch: 15100/20000, Loss: 0.00006028\n",
      "Epoch: 15110/20000, Loss: 0.00005466\n",
      "Epoch: 15120/20000, Loss: 0.00005434\n",
      "Epoch: 15130/20000, Loss: 0.00010047\n",
      "Epoch: 15140/20000, Loss: 0.00008206\n",
      "Epoch: 15150/20000, Loss: 0.00006282\n",
      "Epoch: 15160/20000, Loss: 0.00005620\n",
      "Epoch: 15170/20000, Loss: 0.00005539\n",
      "Epoch: 15180/20000, Loss: 0.00005737\n",
      "Epoch: 15190/20000, Loss: 0.00007841\n",
      "Epoch: 15200/20000, Loss: 0.00013110\n",
      "Epoch: 15210/20000, Loss: 0.00006267\n",
      "Epoch: 15220/20000, Loss: 0.00006285\n",
      "Epoch: 15230/20000, Loss: 0.00005664\n",
      "Epoch: 15240/20000, Loss: 0.00006538\n",
      "Epoch: 15250/20000, Loss: 0.00011485\n",
      "Epoch: 15260/20000, Loss: 0.00005571\n",
      "Epoch: 15270/20000, Loss: 0.00005259\n",
      "Epoch: 15280/20000, Loss: 0.00005353\n",
      "Epoch: 15290/20000, Loss: 0.00005774\n",
      "Epoch: 15300/20000, Loss: 0.00009064\n",
      "Epoch: 15310/20000, Loss: 0.00009300\n",
      "Epoch: 15320/20000, Loss: 0.00007230\n",
      "Epoch: 15330/20000, Loss: 0.00005451\n",
      "Epoch: 15340/20000, Loss: 0.00005438\n",
      "Epoch: 15350/20000, Loss: 0.00005680\n",
      "Epoch: 15360/20000, Loss: 0.00009321\n",
      "Epoch: 15370/20000, Loss: 0.00024485\n",
      "Epoch: 15380/20000, Loss: 0.00010176\n",
      "Epoch: 15390/20000, Loss: 0.00006752\n",
      "Epoch: 15400/20000, Loss: 0.00005278\n",
      "Epoch: 15410/20000, Loss: 0.00005219\n",
      "Epoch: 15420/20000, Loss: 0.00006530\n",
      "Epoch: 15430/20000, Loss: 0.00005335\n",
      "Epoch: 15440/20000, Loss: 0.00005014\n",
      "Epoch: 15450/20000, Loss: 0.00005045\n",
      "Epoch: 15460/20000, Loss: 0.00007130\n",
      "Epoch: 15470/20000, Loss: 0.00021460\n",
      "Epoch: 15480/20000, Loss: 0.00008841\n",
      "Epoch: 15490/20000, Loss: 0.00005827\n",
      "Epoch: 15500/20000, Loss: 0.00005504\n",
      "Epoch: 15510/20000, Loss: 0.00005247\n",
      "Epoch: 15520/20000, Loss: 0.00005254\n",
      "Epoch: 15530/20000, Loss: 0.00005670\n",
      "Epoch: 15540/20000, Loss: 0.00005985\n",
      "Epoch: 15550/20000, Loss: 0.00010279\n",
      "Epoch: 15560/20000, Loss: 0.00009406\n",
      "Epoch: 15570/20000, Loss: 0.00011786\n",
      "Epoch: 15580/20000, Loss: 0.00006326\n",
      "Epoch: 15590/20000, Loss: 0.00008859\n",
      "Epoch: 15600/20000, Loss: 0.00005246\n",
      "Epoch: 15610/20000, Loss: 0.00005332\n",
      "Epoch: 15620/20000, Loss: 0.00004978\n",
      "Epoch: 15630/20000, Loss: 0.00004974\n",
      "Epoch: 15640/20000, Loss: 0.00005143\n",
      "Epoch: 15650/20000, Loss: 0.00005432\n",
      "Epoch: 15660/20000, Loss: 0.00009649\n",
      "Epoch: 15670/20000, Loss: 0.00007883\n",
      "Epoch: 15680/20000, Loss: 0.00007419\n",
      "Epoch: 15690/20000, Loss: 0.00005254\n",
      "Epoch: 15700/20000, Loss: 0.00005286\n",
      "Epoch: 15710/20000, Loss: 0.00005731\n",
      "Epoch: 15720/20000, Loss: 0.00010212\n",
      "Epoch: 15730/20000, Loss: 0.00005891\n",
      "Epoch: 15740/20000, Loss: 0.00005993\n",
      "Epoch: 15750/20000, Loss: 0.00005235\n",
      "Epoch: 15760/20000, Loss: 0.00005305\n",
      "Epoch: 15770/20000, Loss: 0.00006169\n",
      "Epoch: 15780/20000, Loss: 0.00010869\n",
      "Epoch: 15790/20000, Loss: 0.00006588\n",
      "Epoch: 15800/20000, Loss: 0.00006667\n",
      "Epoch: 15810/20000, Loss: 0.00005594\n",
      "Epoch: 15820/20000, Loss: 0.00005547\n",
      "Epoch: 15830/20000, Loss: 0.00007567\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 15840/20000, Loss: 0.00013740\n",
      "Epoch: 15850/20000, Loss: 0.00014900\n",
      "Epoch: 15860/20000, Loss: 0.00008554\n",
      "Epoch: 15870/20000, Loss: 0.00005890\n",
      "Epoch: 15880/20000, Loss: 0.00005031\n",
      "Epoch: 15890/20000, Loss: 0.00004931\n",
      "Epoch: 15900/20000, Loss: 0.00005094\n",
      "Epoch: 15910/20000, Loss: 0.00007552\n",
      "Epoch: 15920/20000, Loss: 0.00013232\n",
      "Epoch: 15930/20000, Loss: 0.00007687\n",
      "Epoch: 15940/20000, Loss: 0.00005974\n",
      "Epoch: 15950/20000, Loss: 0.00005515\n",
      "Epoch: 15960/20000, Loss: 0.00008444\n",
      "Epoch: 15970/20000, Loss: 0.00007467\n",
      "Epoch: 15980/20000, Loss: 0.00006884\n",
      "Epoch: 15990/20000, Loss: 0.00005191\n",
      "Epoch: 16000/20000, Loss: 0.00004990\n",
      "Epoch: 16010/20000, Loss: 0.00004995\n",
      "Epoch: 16020/20000, Loss: 0.00008569\n",
      "Epoch: 16030/20000, Loss: 0.00011066\n",
      "Epoch: 16040/20000, Loss: 0.00008005\n",
      "Epoch: 16050/20000, Loss: 0.00006237\n",
      "Epoch: 16060/20000, Loss: 0.00005239\n",
      "Epoch: 16070/20000, Loss: 0.00005422\n",
      "Epoch: 16080/20000, Loss: 0.00005142\n",
      "Epoch: 16090/20000, Loss: 0.00005245\n",
      "Epoch: 16100/20000, Loss: 0.00006410\n",
      "Epoch: 16110/20000, Loss: 0.00016903\n",
      "Epoch: 16120/20000, Loss: 0.00006007\n",
      "Epoch: 16130/20000, Loss: 0.00006248\n",
      "Epoch: 16140/20000, Loss: 0.00005136\n",
      "Epoch: 16150/20000, Loss: 0.00004922\n",
      "Epoch: 16160/20000, Loss: 0.00005432\n",
      "Epoch: 16170/20000, Loss: 0.00021033\n",
      "Epoch: 16180/20000, Loss: 0.00010729\n",
      "Epoch: 16190/20000, Loss: 0.00006161\n",
      "Epoch: 16200/20000, Loss: 0.00005339\n",
      "Epoch: 16210/20000, Loss: 0.00005200\n",
      "Epoch: 16220/20000, Loss: 0.00005060\n",
      "Epoch: 16230/20000, Loss: 0.00005224\n",
      "Epoch: 16240/20000, Loss: 0.00005479\n",
      "Epoch: 16250/20000, Loss: 0.00011011\n",
      "Epoch: 16260/20000, Loss: 0.00009488\n",
      "Epoch: 16270/20000, Loss: 0.00006962\n",
      "Epoch: 16280/20000, Loss: 0.00005411\n",
      "Epoch: 16290/20000, Loss: 0.00005116\n",
      "Epoch: 16300/20000, Loss: 0.00005019\n",
      "Epoch: 16310/20000, Loss: 0.00005341\n",
      "Epoch: 16320/20000, Loss: 0.00024407\n",
      "Epoch: 16330/20000, Loss: 0.00011995\n",
      "Epoch: 16340/20000, Loss: 0.00006240\n",
      "Epoch: 16350/20000, Loss: 0.00005756\n",
      "Epoch: 16360/20000, Loss: 0.00005165\n",
      "Epoch: 16370/20000, Loss: 0.00005357\n",
      "Epoch: 16380/20000, Loss: 0.00005303\n",
      "Epoch: 16390/20000, Loss: 0.00005250\n",
      "Epoch: 16400/20000, Loss: 0.00005915\n",
      "Epoch: 16410/20000, Loss: 0.00015487\n",
      "Epoch: 16420/20000, Loss: 0.00010032\n",
      "Epoch: 16430/20000, Loss: 0.00005964\n",
      "Epoch: 16440/20000, Loss: 0.00005620\n",
      "Epoch: 16450/20000, Loss: 0.00005128\n",
      "Epoch: 16460/20000, Loss: 0.00005343\n",
      "Epoch: 16470/20000, Loss: 0.00008810\n",
      "Epoch: 16480/20000, Loss: 0.00007988\n",
      "Epoch: 16490/20000, Loss: 0.00006364\n",
      "Epoch: 16500/20000, Loss: 0.00005423\n",
      "Epoch: 16510/20000, Loss: 0.00005046\n",
      "Epoch: 16520/20000, Loss: 0.00005093\n",
      "Epoch: 16530/20000, Loss: 0.00005299\n",
      "Epoch: 16540/20000, Loss: 0.00009487\n",
      "Epoch: 16550/20000, Loss: 0.00014466\n",
      "Epoch: 16560/20000, Loss: 0.00007353\n",
      "Epoch: 16570/20000, Loss: 0.00005818\n",
      "Epoch: 16580/20000, Loss: 0.00005275\n",
      "Epoch: 16590/20000, Loss: 0.00005060\n",
      "Epoch: 16600/20000, Loss: 0.00004944\n",
      "Epoch: 16610/20000, Loss: 0.00005143\n",
      "Epoch: 16620/20000, Loss: 0.00011106\n",
      "Epoch: 16630/20000, Loss: 0.00008167\n",
      "Epoch: 16640/20000, Loss: 0.00006359\n",
      "Epoch: 16650/20000, Loss: 0.00005625\n",
      "Epoch: 16660/20000, Loss: 0.00015081\n",
      "Epoch: 16670/20000, Loss: 0.00011575\n",
      "Epoch: 16680/20000, Loss: 0.00006854\n",
      "Epoch: 16690/20000, Loss: 0.00006197\n",
      "Epoch: 16700/20000, Loss: 0.00005076\n",
      "Epoch: 16710/20000, Loss: 0.00005202\n",
      "Epoch: 16720/20000, Loss: 0.00005117\n",
      "Epoch: 16730/20000, Loss: 0.00005189\n",
      "Epoch: 16740/20000, Loss: 0.00005376\n",
      "Epoch: 16750/20000, Loss: 0.00005461\n",
      "Epoch: 16760/20000, Loss: 0.00005875\n",
      "Epoch: 16770/20000, Loss: 0.00007885\n",
      "Epoch: 16780/20000, Loss: 0.00020534\n",
      "Epoch: 16790/20000, Loss: 0.00008369\n",
      "Epoch: 16800/20000, Loss: 0.00006233\n",
      "Epoch: 16810/20000, Loss: 0.00005416\n",
      "Epoch: 16820/20000, Loss: 0.00004971\n",
      "Epoch: 16830/20000, Loss: 0.00005004\n",
      "Epoch: 16840/20000, Loss: 0.00005283\n",
      "Epoch: 16850/20000, Loss: 0.00005441\n",
      "Epoch: 16860/20000, Loss: 0.00008198\n",
      "Epoch: 16870/20000, Loss: 0.00015237\n",
      "Epoch: 16880/20000, Loss: 0.00006903\n",
      "Epoch: 16890/20000, Loss: 0.00005835\n",
      "Epoch: 16900/20000, Loss: 0.00005314\n",
      "Epoch: 16910/20000, Loss: 0.00005173\n",
      "Epoch: 16920/20000, Loss: 0.00005178\n",
      "Epoch: 16930/20000, Loss: 0.00005738\n",
      "Epoch: 16940/20000, Loss: 0.00017162\n",
      "Epoch: 16950/20000, Loss: 0.00008801\n",
      "Epoch: 16960/20000, Loss: 0.00005957\n",
      "Epoch: 16970/20000, Loss: 0.00005323\n",
      "Epoch: 16980/20000, Loss: 0.00005084\n",
      "Epoch: 16990/20000, Loss: 0.00006354\n",
      "Epoch: 17000/20000, Loss: 0.00013921\n",
      "Epoch: 17010/20000, Loss: 0.00006850\n",
      "Epoch: 17020/20000, Loss: 0.00005394\n",
      "Epoch: 17030/20000, Loss: 0.00005332\n",
      "Epoch: 17040/20000, Loss: 0.00005264\n",
      "Epoch: 17050/20000, Loss: 0.00005449\n",
      "Epoch: 17060/20000, Loss: 0.00007826\n",
      "Epoch: 17070/20000, Loss: 0.00014550\n",
      "Epoch: 17080/20000, Loss: 0.00008149\n",
      "Epoch: 17090/20000, Loss: 0.00006082\n",
      "Epoch: 17100/20000, Loss: 0.00005217\n",
      "Epoch: 17110/20000, Loss: 0.00005433\n",
      "Epoch: 17120/20000, Loss: 0.00005383\n",
      "Epoch: 17130/20000, Loss: 0.00008240\n",
      "Epoch: 17140/20000, Loss: 0.00017975\n",
      "Epoch: 17150/20000, Loss: 0.00006610\n",
      "Epoch: 17160/20000, Loss: 0.00006106\n",
      "Epoch: 17170/20000, Loss: 0.00005447\n",
      "Epoch: 17180/20000, Loss: 0.00005033\n",
      "Epoch: 17190/20000, Loss: 0.00005266\n",
      "Epoch: 17200/20000, Loss: 0.00011917\n",
      "Epoch: 17210/20000, Loss: 0.00005828\n",
      "Epoch: 17220/20000, Loss: 0.00005727\n",
      "Epoch: 17230/20000, Loss: 0.00005278\n",
      "Epoch: 17240/20000, Loss: 0.00005074\n",
      "Epoch: 17250/20000, Loss: 0.00005103\n",
      "Epoch: 17260/20000, Loss: 0.00005000\n",
      "Epoch: 17270/20000, Loss: 0.00005397\n",
      "Epoch: 17280/20000, Loss: 0.00006008\n",
      "Epoch: 17290/20000, Loss: 0.00010499\n",
      "Epoch: 17300/20000, Loss: 0.00010709\n",
      "Epoch: 17310/20000, Loss: 0.00006447\n",
      "Epoch: 17320/20000, Loss: 0.00006186\n",
      "Epoch: 17330/20000, Loss: 0.00005621\n",
      "Epoch: 17340/20000, Loss: 0.00005213\n",
      "Epoch: 17350/20000, Loss: 0.00005099\n",
      "Epoch: 17360/20000, Loss: 0.00005129\n",
      "Epoch: 17370/20000, Loss: 0.00005330\n",
      "Epoch: 17380/20000, Loss: 0.00007507\n",
      "Epoch: 17390/20000, Loss: 0.00019478\n",
      "Epoch: 17400/20000, Loss: 0.00006999\n",
      "Epoch: 17410/20000, Loss: 0.00006263\n",
      "Epoch: 17420/20000, Loss: 0.00005202\n",
      "Epoch: 17430/20000, Loss: 0.00004951\n",
      "Epoch: 17440/20000, Loss: 0.00007062\n",
      "Epoch: 17450/20000, Loss: 0.00017569\n",
      "Epoch: 17460/20000, Loss: 0.00008671\n",
      "Epoch: 17470/20000, Loss: 0.00006094\n",
      "Epoch: 17480/20000, Loss: 0.00005432\n",
      "Epoch: 17490/20000, Loss: 0.00005061\n",
      "Epoch: 17500/20000, Loss: 0.00004980\n",
      "Epoch: 17510/20000, Loss: 0.00005223\n",
      "Epoch: 17520/20000, Loss: 0.00005643\n",
      "Epoch: 17530/20000, Loss: 0.00007510\n",
      "Epoch: 17540/20000, Loss: 0.00025332\n",
      "Epoch: 17550/20000, Loss: 0.00011695\n",
      "Epoch: 17560/20000, Loss: 0.00005661\n",
      "Epoch: 17570/20000, Loss: 0.00005740\n",
      "Epoch: 17580/20000, Loss: 0.00005165\n",
      "Epoch: 17590/20000, Loss: 0.00004994\n",
      "Epoch: 17600/20000, Loss: 0.00005162\n",
      "Epoch: 17610/20000, Loss: 0.00006364\n",
      "Epoch: 17620/20000, Loss: 0.00006595\n",
      "Epoch: 17630/20000, Loss: 0.00012447\n",
      "Epoch: 17640/20000, Loss: 0.00005673\n",
      "Epoch: 17650/20000, Loss: 0.00005320\n",
      "Epoch: 17660/20000, Loss: 0.00005260\n",
      "Epoch: 17670/20000, Loss: 0.00005725\n",
      "Epoch: 17680/20000, Loss: 0.00019614\n",
      "Epoch: 17690/20000, Loss: 0.00007427\n",
      "Epoch: 17700/20000, Loss: 0.00005695\n",
      "Epoch: 17710/20000, Loss: 0.00005453\n",
      "Epoch: 17720/20000, Loss: 0.00005147\n",
      "Epoch: 17730/20000, Loss: 0.00005198\n",
      "Epoch: 17740/20000, Loss: 0.00006040\n",
      "Epoch: 17750/20000, Loss: 0.00019273\n",
      "Epoch: 17760/20000, Loss: 0.00009629\n",
      "Epoch: 17770/20000, Loss: 0.00006666\n",
      "Epoch: 17780/20000, Loss: 0.00005312\n",
      "Epoch: 17790/20000, Loss: 0.00005100\n",
      "Epoch: 17800/20000, Loss: 0.00005159\n",
      "Epoch: 17810/20000, Loss: 0.00005744\n",
      "Epoch: 17820/20000, Loss: 0.00010954\n",
      "Epoch: 17830/20000, Loss: 0.00007496\n",
      "Epoch: 17840/20000, Loss: 0.00006328\n",
      "Epoch: 17850/20000, Loss: 0.00005312\n",
      "Epoch: 17860/20000, Loss: 0.00005059\n",
      "Epoch: 17870/20000, Loss: 0.00004920\n",
      "Epoch: 17880/20000, Loss: 0.00005364\n",
      "Epoch: 17890/20000, Loss: 0.00020141\n",
      "Epoch: 17900/20000, Loss: 0.00015786\n",
      "Epoch: 17910/20000, Loss: 0.00006497\n",
      "Epoch: 17920/20000, Loss: 0.00006326\n",
      "Epoch: 17930/20000, Loss: 0.00005505\n",
      "Epoch: 17940/20000, Loss: 0.00005207\n",
      "Epoch: 17950/20000, Loss: 0.00005065\n",
      "Epoch: 17960/20000, Loss: 0.00005393\n",
      "Epoch: 17970/20000, Loss: 0.00005954\n",
      "Epoch: 17980/20000, Loss: 0.00012965\n",
      "Epoch: 17990/20000, Loss: 0.00007794\n",
      "Epoch: 18000/20000, Loss: 0.00005803\n",
      "Epoch: 18010/20000, Loss: 0.00005113\n",
      "Epoch: 18020/20000, Loss: 0.00004913\n",
      "Epoch: 18030/20000, Loss: 0.00005476\n",
      "Epoch: 18040/20000, Loss: 0.00014258\n",
      "Epoch: 18050/20000, Loss: 0.00006261\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 18060/20000, Loss: 0.00005759\n",
      "Epoch: 18070/20000, Loss: 0.00005286\n",
      "Epoch: 18080/20000, Loss: 0.00005175\n",
      "Epoch: 18090/20000, Loss: 0.00005116\n",
      "Epoch: 18100/20000, Loss: 0.00005683\n",
      "Epoch: 18110/20000, Loss: 0.00017813\n",
      "Epoch: 18120/20000, Loss: 0.00009482\n",
      "Epoch: 18130/20000, Loss: 0.00006430\n",
      "Epoch: 18140/20000, Loss: 0.00005533\n",
      "Epoch: 18150/20000, Loss: 0.00006118\n",
      "Epoch: 18160/20000, Loss: 0.00012944\n",
      "Epoch: 18170/20000, Loss: 0.00006232\n",
      "Epoch: 18180/20000, Loss: 0.00005190\n",
      "Epoch: 18190/20000, Loss: 0.00005090\n",
      "Epoch: 18200/20000, Loss: 0.00005134\n",
      "Epoch: 18210/20000, Loss: 0.00005685\n",
      "Epoch: 18220/20000, Loss: 0.00007572\n",
      "Epoch: 18230/20000, Loss: 0.00014382\n",
      "Epoch: 18240/20000, Loss: 0.00007648\n",
      "Epoch: 18250/20000, Loss: 0.00005814\n",
      "Epoch: 18260/20000, Loss: 0.00005334\n",
      "Epoch: 18270/20000, Loss: 0.00006010\n",
      "Epoch: 18280/20000, Loss: 0.00008942\n",
      "Epoch: 18290/20000, Loss: 0.00007000\n",
      "Epoch: 18300/20000, Loss: 0.00006338\n",
      "Epoch: 18310/20000, Loss: 0.00007887\n",
      "Epoch: 18320/20000, Loss: 0.00010380\n",
      "Epoch: 18330/20000, Loss: 0.00005648\n",
      "Epoch: 18340/20000, Loss: 0.00005162\n",
      "Epoch: 18350/20000, Loss: 0.00005057\n",
      "Epoch: 18360/20000, Loss: 0.00006025\n",
      "Epoch: 18370/20000, Loss: 0.00014009\n",
      "Epoch: 18380/20000, Loss: 0.00006556\n",
      "Epoch: 18390/20000, Loss: 0.00006087\n",
      "Epoch: 18400/20000, Loss: 0.00005346\n",
      "Epoch: 18410/20000, Loss: 0.00005229\n",
      "Epoch: 18420/20000, Loss: 0.00004943\n",
      "Epoch: 18430/20000, Loss: 0.00005290\n",
      "Epoch: 18440/20000, Loss: 0.00015040\n",
      "Epoch: 18450/20000, Loss: 0.00011699\n",
      "Epoch: 18460/20000, Loss: 0.00007896\n",
      "Epoch: 18470/20000, Loss: 0.00005407\n",
      "Epoch: 18480/20000, Loss: 0.00005274\n",
      "Epoch: 18490/20000, Loss: 0.00004955\n",
      "Epoch: 18500/20000, Loss: 0.00004970\n",
      "Epoch: 18510/20000, Loss: 0.00008315\n",
      "Epoch: 18520/20000, Loss: 0.00011570\n",
      "Epoch: 18530/20000, Loss: 0.00006919\n",
      "Epoch: 18540/20000, Loss: 0.00005826\n",
      "Epoch: 18550/20000, Loss: 0.00004985\n",
      "Epoch: 18560/20000, Loss: 0.00004954\n",
      "Epoch: 18570/20000, Loss: 0.00004941\n",
      "Epoch: 18580/20000, Loss: 0.00005897\n",
      "Epoch: 18590/20000, Loss: 0.00017426\n",
      "Epoch: 18600/20000, Loss: 0.00008176\n",
      "Epoch: 18610/20000, Loss: 0.00006436\n",
      "Epoch: 18620/20000, Loss: 0.00005403\n",
      "Epoch: 18630/20000, Loss: 0.00005183\n",
      "Epoch: 18640/20000, Loss: 0.00005070\n",
      "Epoch: 18650/20000, Loss: 0.00005100\n",
      "Epoch: 18660/20000, Loss: 0.00005851\n",
      "Epoch: 18670/20000, Loss: 0.00017095\n",
      "Epoch: 18680/20000, Loss: 0.00010526\n",
      "Epoch: 18690/20000, Loss: 0.00006249\n",
      "Epoch: 18700/20000, Loss: 0.00005653\n",
      "Epoch: 18710/20000, Loss: 0.00005339\n",
      "Epoch: 18720/20000, Loss: 0.00005430\n",
      "Epoch: 18730/20000, Loss: 0.00009650\n",
      "Epoch: 18740/20000, Loss: 0.00007461\n",
      "Epoch: 18750/20000, Loss: 0.00005797\n",
      "Epoch: 18760/20000, Loss: 0.00005234\n",
      "Epoch: 18770/20000, Loss: 0.00005116\n",
      "Epoch: 18780/20000, Loss: 0.00005095\n",
      "Epoch: 18790/20000, Loss: 0.00005283\n",
      "Epoch: 18800/20000, Loss: 0.00009461\n",
      "Epoch: 18810/20000, Loss: 0.00011660\n",
      "Epoch: 18820/20000, Loss: 0.00007862\n",
      "Epoch: 18830/20000, Loss: 0.00005493\n",
      "Epoch: 18840/20000, Loss: 0.00005273\n",
      "Epoch: 18850/20000, Loss: 0.00005117\n",
      "Epoch: 18860/20000, Loss: 0.00006349\n",
      "Epoch: 18870/20000, Loss: 0.00014086\n",
      "Epoch: 18880/20000, Loss: 0.00007241\n",
      "Epoch: 18890/20000, Loss: 0.00005430\n",
      "Epoch: 18900/20000, Loss: 0.00005106\n",
      "Epoch: 18910/20000, Loss: 0.00005203\n",
      "Epoch: 18920/20000, Loss: 0.00005727\n",
      "Epoch: 18930/20000, Loss: 0.00010845\n",
      "Epoch: 18940/20000, Loss: 0.00008502\n",
      "Epoch: 18950/20000, Loss: 0.00006465\n",
      "Epoch: 18960/20000, Loss: 0.00005505\n",
      "Epoch: 18970/20000, Loss: 0.00005144\n",
      "Epoch: 18980/20000, Loss: 0.00004967\n",
      "Epoch: 18990/20000, Loss: 0.00005771\n",
      "Epoch: 19000/20000, Loss: 0.00021931\n",
      "Epoch: 19010/20000, Loss: 0.00011388\n",
      "Epoch: 19020/20000, Loss: 0.00005905\n",
      "Epoch: 19030/20000, Loss: 0.00005352\n",
      "Epoch: 19040/20000, Loss: 0.00005472\n",
      "Epoch: 19050/20000, Loss: 0.00009473\n",
      "Epoch: 19060/20000, Loss: 0.00006503\n",
      "Epoch: 19070/20000, Loss: 0.00005663\n",
      "Epoch: 19080/20000, Loss: 0.00005298\n",
      "Epoch: 19090/20000, Loss: 0.00004938\n",
      "Epoch: 19100/20000, Loss: 0.00005289\n",
      "Epoch: 19110/20000, Loss: 0.00006377\n",
      "Epoch: 19120/20000, Loss: 0.00014310\n",
      "Epoch: 19130/20000, Loss: 0.00007147\n",
      "Epoch: 19140/20000, Loss: 0.00006053\n",
      "Epoch: 19150/20000, Loss: 0.00005720\n",
      "Epoch: 19160/20000, Loss: 0.00005561\n",
      "Epoch: 19170/20000, Loss: 0.00005215\n",
      "Epoch: 19180/20000, Loss: 0.00006404\n",
      "Epoch: 19190/20000, Loss: 0.00016602\n",
      "Epoch: 19200/20000, Loss: 0.00007180\n",
      "Epoch: 19210/20000, Loss: 0.00005936\n",
      "Epoch: 19220/20000, Loss: 0.00005296\n",
      "Epoch: 19230/20000, Loss: 0.00005111\n",
      "Epoch: 19240/20000, Loss: 0.00004989\n",
      "Epoch: 19250/20000, Loss: 0.00005637\n",
      "Epoch: 19260/20000, Loss: 0.00018545\n",
      "Epoch: 19270/20000, Loss: 0.00010701\n",
      "Epoch: 19280/20000, Loss: 0.00006941\n",
      "Epoch: 19290/20000, Loss: 0.00005375\n",
      "Epoch: 19300/20000, Loss: 0.00005435\n",
      "Epoch: 19310/20000, Loss: 0.00009169\n",
      "Epoch: 19320/20000, Loss: 0.00006175\n",
      "Epoch: 19330/20000, Loss: 0.00005721\n",
      "Epoch: 19340/20000, Loss: 0.00005239\n",
      "Epoch: 19350/20000, Loss: 0.00004990\n",
      "Epoch: 19360/20000, Loss: 0.00005092\n",
      "Epoch: 19370/20000, Loss: 0.00006024\n",
      "Epoch: 19380/20000, Loss: 0.00023226\n",
      "Epoch: 19390/20000, Loss: 0.00011171\n",
      "Epoch: 19400/20000, Loss: 0.00006275\n",
      "Epoch: 19410/20000, Loss: 0.00005712\n",
      "Epoch: 19420/20000, Loss: 0.00005160\n",
      "Epoch: 19430/20000, Loss: 0.00005205\n",
      "Epoch: 19440/20000, Loss: 0.00005193\n",
      "Epoch: 19450/20000, Loss: 0.00005208\n",
      "Epoch: 19460/20000, Loss: 0.00005901\n",
      "Epoch: 19470/20000, Loss: 0.00016782\n",
      "Epoch: 19480/20000, Loss: 0.00009146\n",
      "Epoch: 19490/20000, Loss: 0.00006075\n",
      "Epoch: 19500/20000, Loss: 0.00005169\n",
      "Epoch: 19510/20000, Loss: 0.00005147\n",
      "Epoch: 19520/20000, Loss: 0.00004872\n",
      "Epoch: 19530/20000, Loss: 0.00004873\n",
      "Epoch: 19540/20000, Loss: 0.00004915\n",
      "Epoch: 19550/20000, Loss: 0.00005299\n",
      "Epoch: 19560/20000, Loss: 0.00022852\n",
      "Epoch: 19570/20000, Loss: 0.00018684\n",
      "Epoch: 19580/20000, Loss: 0.00006041\n",
      "Epoch: 19590/20000, Loss: 0.00006367\n",
      "Epoch: 19600/20000, Loss: 0.00005087\n",
      "Epoch: 19610/20000, Loss: 0.00005055\n",
      "Epoch: 19620/20000, Loss: 0.00004918\n",
      "Epoch: 19630/20000, Loss: 0.00005072\n",
      "Epoch: 19640/20000, Loss: 0.00005204\n",
      "Epoch: 19650/20000, Loss: 0.00006000\n",
      "Epoch: 19660/20000, Loss: 0.00005699\n",
      "Epoch: 19670/20000, Loss: 0.00005447\n",
      "Epoch: 19680/20000, Loss: 0.00005792\n",
      "Epoch: 19690/20000, Loss: 0.00015571\n",
      "Epoch: 19700/20000, Loss: 0.00007526\n",
      "Epoch: 19710/20000, Loss: 0.00006258\n",
      "Epoch: 19720/20000, Loss: 0.00005295\n",
      "Epoch: 19730/20000, Loss: 0.00004982\n",
      "Epoch: 19740/20000, Loss: 0.00005772\n",
      "Epoch: 19750/20000, Loss: 0.00021497\n",
      "Epoch: 19760/20000, Loss: 0.00009908\n",
      "Epoch: 19770/20000, Loss: 0.00006403\n",
      "Epoch: 19780/20000, Loss: 0.00005369\n",
      "Epoch: 19790/20000, Loss: 0.00005072\n",
      "Epoch: 19800/20000, Loss: 0.00005200\n",
      "Epoch: 19810/20000, Loss: 0.00005720\n",
      "Epoch: 19820/20000, Loss: 0.00005576\n",
      "Epoch: 19830/20000, Loss: 0.00006017\n",
      "Epoch: 19840/20000, Loss: 0.00006973\n",
      "Epoch: 19850/20000, Loss: 0.00024011\n",
      "Epoch: 19860/20000, Loss: 0.00011325\n",
      "Epoch: 19870/20000, Loss: 0.00006057\n",
      "Epoch: 19880/20000, Loss: 0.00005296\n",
      "Epoch: 19890/20000, Loss: 0.00005130\n",
      "Epoch: 19900/20000, Loss: 0.00005250\n",
      "Epoch: 19910/20000, Loss: 0.00005125\n",
      "Epoch: 19920/20000, Loss: 0.00004983\n",
      "Epoch: 19930/20000, Loss: 0.00005862\n",
      "Epoch: 19940/20000, Loss: 0.00016540\n",
      "Epoch: 19950/20000, Loss: 0.00008095\n",
      "Epoch: 19960/20000, Loss: 0.00006785\n",
      "Epoch: 19970/20000, Loss: 0.00005511\n",
      "Epoch: 19980/20000, Loss: 0.00005158\n",
      "Epoch: 19990/20000, Loss: 0.00010773\n",
      "Epoch: 20000/20000, Loss: 0.00008169\n"
     ]
    }
   ],
   "source": [
    "# Create LSTM instance\n",
    "lstm = LSTM(input_size, hidden_size, output_size)\n",
    "\n",
    "# Loss and optimizer\n",
    "criterion = nn.MSELoss()\n",
    "optimizer = torch.optim.Adam(lstm.parameters(), lr=0.01)\n",
    "\n",
    "# Training loop\n",
    "for epoch in range(num_epochs):\n",
    "    # Set initial hidden state and cell state\n",
    "    hidden = torch.zeros(1, batch_size, hidden_size)\n",
    "    cell = torch.zeros(1, batch_size, hidden_size)\n",
    "\n",
    "    # Forward pass\n",
    "    output, (hidden, cell) = lstm(input_tensor, (hidden, cell))\n",
    "    loss = criterion(output, target_tensor)\n",
    "\n",
    "    # Backward and optimize\n",
    "    optimizer.zero_grad()\n",
    "    loss.backward()\n",
    "    optimizer.step()\n",
    "\n",
    "    # Print progress\n",
    "    if (epoch+1) % 10 == 0:\n",
    "        print(f'Epoch: {epoch+1}/{num_epochs}, Loss: {loss.item():.8f}')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "5551399f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1, 256)\n",
      "(1, 201)\n",
      "(256, 201)\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/data/localhome/tkapoor/.local/lib/python3.8/site-packages/numpy/ma/core.py:2820: ComplexWarning: Casting complex values to real discards the imaginary part\n",
      "  _data = np.array(data, dtype=dtype, copy=copy,\n",
      "/usr/local/lib/python3.8/dist-packages/matplotlib/contour.py:1180: ComplexWarning: Casting complex values to real discards the imaginary part\n",
      "  self.levels = np.asarray(levels_arg).astype(np.float64)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "<Figure size 432x288 with 0 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1080x360 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import scipy.io\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# Load the .mat file\n",
    "mat_data = scipy.io.loadmat('NLS.mat')\n",
    "\n",
    "# Following is the code to plot the data u vs x and t. u is 256*100\n",
    "# matrix. Use first 75 columns for training and 25 for testing :)\n",
    "\n",
    "# Access the variables stored in the .mat file\n",
    "# The variable names in the .mat file become keys in the loaded dictionary\n",
    "x = mat_data['x']\n",
    "t = mat_data['tt']\n",
    "u = mat_data['uu']\n",
    "\n",
    "# Use the loaded variables as needed\n",
    "print(x.shape)\n",
    "print(t.shape)\n",
    "print(u.shape)\n",
    "\n",
    "X, T = np.meshgrid(x, t)\n",
    "# Define custom color levels\n",
    "c_levels = np.linspace(np.min(u), np.max(u), 100)\n",
    "\n",
    "# Plot the contour\n",
    "plt.figure()\n",
    "plt.figure(figsize=(15, 5))\n",
    "plt.contourf(T, X, u.T, levels=c_levels, cmap='coolwarm')\n",
    "plt.xlabel('t')\n",
    "plt.ylabel('x')\n",
    "plt.title('Schrondinger-Equation')\n",
    "plt.colorbar()  # Add a colorbar for the contour levels\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "84308d61",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([1, 40, 256])\n",
      "final_time_output torch.Size([40, 256])\n",
      "torch.Size([256])\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "with torch.no_grad():\n",
    "    hidden_pred = torch.zeros(1, batch_size, hidden_size)\n",
    "    cell_pred = torch.zeros(1, batch_size, hidden_size)\n",
    "    prediction, _ = lstm(test_tensor, (hidden_pred, cell_pred))\n",
    "    \n",
    "print(prediction.shape)\n",
    "\n",
    "final_time_output = prediction[-1, :]\n",
    "print(\"final_time_output\", final_time_output.shape)\n",
    "\n",
    "final_time_output1 = final_time_output[-1, :]\n",
    "print(final_time_output1.shape)\n",
    "\n",
    "final_out = final_time_output1.detach().numpy().reshape(-1,)\n",
    "final_true = u[:,-1].reshape(-1,1)\n",
    "\n",
    "final_true = np.abs(final_true)\n",
    "final_out = np.abs(final_out)\n",
    "\n",
    "plt.plot(x.T, final_out)\n",
    "plt.plot(x.T, final_true)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "c9c29dd5",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Relative Error Test:  0.9748395915559801 \n"
     ]
    }
   ],
   "source": [
    "# Convert NumPy arrays to PyTorch tensors\n",
    "final_out_tensor = torch.from_numpy(final_out)\n",
    "final_true_tensor = torch.from_numpy(final_true)\n",
    "final_true_tensor = torch.abs(final_true_tensor)\n",
    "\n",
    "# Compute the relative L2 error norm (generalization error)\n",
    "relative_error_test = torch.mean((final_out_tensor - final_true_tensor)**2)/torch.mean(final_true_tensor**2)\n",
    "print(\"Relative Error Test: \", relative_error_test.item(), \"\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "f784a4e6",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "pytorch",
   "language": "python",
   "name": "pytorch"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
